/// <summary> /// 将对象序列化成字节数组 /// </summary> /// <param name="value"></param> /// <returns></returns> protected virtual byte[] SerializeObject(object value) { //all length //, item 1 name size, item 1 name data, item 1 value size, item 1 value data //, item 2 name size, item 2 name data, item 2 value size, item 2 value data //, item N name size, item N name data, item N value size, item N value data // var ps = PropertyAccessor.GetGets(value.GetType()); object itemValue; // byte[] nameBuffer, valueBuffer, sizeBuffer; int length = 0; int psLength = ps.Length; using (var m = new MemoryStream()) { //all length sizeBuffer = BaseDataConverter.ToBytes(psLength); m.Write(sizeBuffer, 0, SIZE_INT32); // for (int i = 0; i < psLength; i++) { //name nameBuffer = Encoding.UTF8.GetBytes(ps[i].PropertyInfo.Name); length = nameBuffer.Length; sizeBuffer = BaseDataConverter.ToBytes(length); m.Write(sizeBuffer, 0, SIZE_INT32); m.Write(nameBuffer, 0, length); //value itemValue = PropertyAccessor.GetValue(value, ps[i].PropertyInfo.Name); valueBuffer = this.Serialize(itemValue); if (valueBuffer == null) { sizeBuffer = BaseDataConverter.ToBytes(-1); m.Write(sizeBuffer, 0, SIZE_INT32); //no body } else { length = valueBuffer.Length; sizeBuffer = BaseDataConverter.ToBytes(length); m.Write(sizeBuffer, 0, SIZE_INT32); m.Write(valueBuffer, 0, length); } } return(m.ToArray()); } }
/// <summary> /// SerializeArray /// </summary> /// <param name="array"></param> private byte[] SerializeArray(object array) { //item length, item 1, item 2, item N if (array is string[]) { var stringArray = (string[])array; byte[] itemBuffer, lengthBuffer, sizeBuffer; int length; using (var m = new MemoryStream()) { //item length, item size1, item 1, item size 2, item 2, item size N, item N //write item length lengthBuffer = BaseDataConverter.ToBytes(stringArray.Length); m.Write(lengthBuffer, 0, SIZE_INT32); // foreach (string item in stringArray) { if (item == null) { sizeBuffer = BaseDataConverter.ToBytes(-1); //write size m.Write(sizeBuffer, 0, SIZE_INT32); //null item no body } else if ("".Equals(item)) { sizeBuffer = BaseDataConverter.ToBytes(0); //write size m.Write(sizeBuffer, 0, SIZE_INT32); //empty item no body } else { itemBuffer = Encoding.UTF8.GetBytes(item); length = itemBuffer.Length; sizeBuffer = BaseDataConverter.ToBytes(length); //write size m.Write(sizeBuffer, 0, SIZE_INT32); //item m.Write(itemBuffer, 0, length); } } return(m.ToArray()); } } if (array is DateTime[]) { var workArray = (DateTime[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_DATETIME]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { //BaseDataConverter.ToBytes(workArray[i].ToUniversalTime().Ticks, buffer, offset); BaseDataConverter.ToBytes(workArray[i].Ticks, buffer, offset); offset += SIZE_INT64; } return(buffer); } if (array is Boolean[]) { var workArray = (Boolean[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); for (int i = 0; i < arrayLength; i++) { buffer[SIZE_INT32 + i] = (byte)(workArray[i] ? 1 : 0); } return(buffer); } if (array is Byte[]) { var workArray = (Byte[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); Array.Copy(workArray, 0, buffer, SIZE_INT32, arrayLength); return(buffer); } if (array is SByte[]) { var workArray = (SByte[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); for (int i = 0; i < arrayLength; i++) { buffer[SIZE_INT32 + i] = (byte)workArray[i]; } return(buffer); } if (array is Int16[]) { var workArray = (Int16[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_INT16]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_INT16; } return(buffer); } if (array is UInt16[]) { var workArray = (UInt16[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_UINT16]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_UINT16; } return(buffer); } if (array is Int32[]) { var workArray = (Int32[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_INT32]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_INT32; } return(buffer); } if (array is UInt32) { var workArray = (UInt32[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_UINT32]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_UINT32; } return(buffer); } if (array is Int64[]) { var workArray = (Int64[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_INT64]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_INT64; } return(buffer); } if (array is UInt64[]) { var workArray = (UInt64[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_UINT64]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_UINT64; } return(buffer); } if (array is Char[]) { var workArray = (Char[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_CHAR]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_CHAR; } return(buffer); } if (array is Double[]) { var workArray = (Double[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_DOUBLE]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_DOUBLE; } return(buffer); } if (array is Single[]) { var workArray = (Single[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_SINGLE]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_SINGLE; } return(buffer); } if (array is Decimal[]) { var workArray = (Decimal[])array; var arrayLength = workArray.Length; var buffer = new byte[SIZE_INT32 + arrayLength * SIZE_DECIMAL]; BaseDataConverter.ToBytes(arrayLength, buffer, 0); var offset = SIZE_INT32; for (int i = 0; i < arrayLength; i++) { BaseDataConverter.ToBytes(workArray[i], buffer, offset); offset += SIZE_DECIMAL; } return(buffer); } else { byte[] itemBuffer, lengthBuffer, sizeBuffer; var workArray = (Array)array; var arrayLength = workArray.Length; int length; using (var m = new MemoryStream()) { //write length lengthBuffer = BaseDataConverter.ToBytes(arrayLength); m.Write(lengthBuffer, 0, SIZE_INT32); //item length, item size1, item 1, item size 2, item 2, item size N, item N foreach (var item in workArray) { if (item == null || DBNull.Value.Equals(item)) { sizeBuffer = BaseDataConverter.ToBytes(-1); //write size m.Write(sizeBuffer, 0, SIZE_INT32); //null item no body } else if (item.GetType().IsArray) { itemBuffer = this.SerializeArray(item); length = itemBuffer.Length; //write size sizeBuffer = BaseDataConverter.ToBytes(length); m.Write(sizeBuffer, 0, SIZE_INT32); //item m.Write(itemBuffer, 0, length); } else { itemBuffer = SerializeObject(item); length = itemBuffer.Length; //write size sizeBuffer = BaseDataConverter.ToBytes(length); m.Write(sizeBuffer, 0, SIZE_INT32); //item m.Write(itemBuffer, 0, length); } } return(m.ToArray()); } } }
/// <summary> /// 序列化数据 /// </summary> /// <param name="value"></param> /// <returns></returns> public byte[] Serialize(object value) { if (value == null) { return(null); } if (DBNull.Value.Equals(value)) { return(null); } if (value is string) { return(Encoding.UTF8.GetBytes((string)value)); } if (value is DateTime) { //return BaseDataConverter.ToBytes(((DateTime)value).ToUniversalTime().Ticks); return(BaseDataConverter.ToBytes(((DateTime)value).Ticks)); } if (value is Boolean) { var buffer = new byte[1]; buffer[0] = (byte)((Boolean)value ? 1 : 0); return(buffer); } if (value is Byte) { var buffer = new byte[1]; buffer[0] = (byte)value; return(buffer); } if (value is SByte) { var buffer = new byte[1]; buffer[0] = (byte)((sbyte)value); return(buffer); } if (value is Int16) { return(BaseDataConverter.ToBytes((Int16)value)); } if (value is UInt16) { return(BaseDataConverter.ToBytes((UInt16)value)); } if (value is Int32) { return(BaseDataConverter.ToBytes((Int32)value)); } if (value is UInt32) { return(BaseDataConverter.ToBytes((UInt32)value)); } if (value is Int64) { return(BaseDataConverter.ToBytes((Int64)value)); } if (value is UInt64) { return(BaseDataConverter.ToBytes((UInt64)value)); } if (value is Char) { return(BaseDataConverter.ToBytes((Char)value)); } if (value is Double) { return(BaseDataConverter.ToBytes((Double)value)); } if (value is Single) { return(BaseDataConverter.ToBytes((Single)value)); } if (value is Decimal) { return(BaseDataConverter.ToBytes((Decimal)value)); } if (value is Array) { return(this.SerializeArray(value)); } return(this.SerializeObject(value)); }