你可以自己实现一个简单的序列化方法,将一个对象转换成Byte[]。以下是一个简单的例子。
如果要实现自己的序列化方法,我的想法是这个序列化以及反序列化的操作相当平凡,且这些要序列化的对象是比较相似的。我给出的例子就是一个简单的IM系统中消息的基类。public class BaseMessage
{
#region Fields
private readonly MessageType m_MsgType; // a value indicate the type of current message. private String[] m_ParaString;
private Int32[] m_ParaInt;
private Boolean[] m_ParaBool;
private Byte[][] m_ParaBytes;
private Boolean m_IsChanged;
private Byte[] m_DataBytes; // reference the bytes which contain serialized data of current message.
#endregion private void SerializeData()
{
Encoding StrEncoder = null;
Int32 DataBuffLen = 0;
Int32 DataBuffOffset = 0;
Byte[] TempParaBytes = null;
List<Byte[]> ParaBytesList = null; StrEncoder = Encoding.UTF8;
DataBuffLen = 1; // set 1 to DataBuffLen is for length of MessageType
ParaBytesList = new List<Byte[]>(); for (Int32 i = 0; i < m_ParaString.Length; i++)
{
TempParaBytes = StrEncoder.GetBytes(m_ParaString[i]);
ParaBytesList.Add(BitConverter.GetBytes((UInt16)TempParaBytes.Length));
ParaBytesList.Add(TempParaBytes);
DataBuffLen += 2 + TempParaBytes.Length;
} DataBuffLen += m_ParaInt.Length * 4;
for (Int32 i = 0; i < m_ParaInt.Length; i++)
ParaBytesList.Add(BitConverter.GetBytes(m_ParaInt[i])); DataBuffLen += m_ParaBool.Length * 1;
for (Int32 i = 0; i < m_ParaBool.Length; i++)
ParaBytesList.Add(BitConverter.GetBytes(m_ParaBool[i])); for (Int32 i = 0; i < m_ParaBytes.Length; i++)
{
TempParaBytes = m_ParaBytes[i];
ParaBytesList.Add(BitConverter.GetBytes((UInt16)TempParaBytes.Length));
ParaBytesList.Add(TempParaBytes);
DataBuffLen += 2 + TempParaBytes.Length;
} m_DataBytes = new Byte[DataBuffLen];
m_DataBytes[0] = (Byte)m_MsgType;
DataBuffOffset = 1;
for (Int32 i = 0; i < ParaBytesList.Count; i++)
{
TempParaBytes = ParaBytesList[i];
Array.Copy(TempParaBytes, 0, m_DataBytes, DataBuffOffset, TempParaBytes.Length);
DataBuffOffset += TempParaBytes.Length;
} m_IsChanged = false;
} private void DeserializeData()
{
Encoding StrEncoder = null;
Int32 DataBuffOffset = 0;
Int32 ParaLength = 0; StrEncoder = Encoding.UTF8;
DataBuffOffset = 1; for (Int32 i = 0; i < m_ParaString.Length; i++)
{
ParaLength = BitConverter.ToUInt16(m_DataBytes, DataBuffOffset);
DataBuffOffset += 2;
m_ParaString[i] = StrEncoder.GetString(m_DataBytes, DataBuffOffset, ParaLength);
DataBuffOffset += ParaLength;
} for (Int32 i = 0; i < m_ParaInt.Length; i++)
{
m_ParaInt[i] = BitConverter.ToInt32(m_DataBytes, DataBuffOffset);
DataBuffOffset += 4;
} for (Int32 i = 0; i < m_ParaBool.Length; i++)
{
m_ParaBool[i] = BitConverter.ToBoolean(m_DataBytes, DataBuffOffset);
DataBuffOffset += 1;
} for (Int32 i = 0; i < m_ParaBytes.Length; i++)
{
ParaLength = BitConverter.ToUInt16(m_DataBytes, DataBuffOffset);
DataBuffOffset += 2;
m_ParaBytes[i] = new Byte[ParaLength];
Array.Copy(m_DataBytes, DataBuffOffset, m_ParaBytes[i], 0, ParaLength);
DataBuffOffset += ParaLength;
} m_IsChanged = false;
}
}
如果要实现自己的序列化方法,我的想法是这个序列化以及反序列化的操作相当平凡,且这些要序列化的对象是比较相似的。我给出的例子就是一个简单的IM系统中消息的基类。public class BaseMessage
{
#region Fields
private readonly MessageType m_MsgType; // a value indicate the type of current message. private String[] m_ParaString;
private Int32[] m_ParaInt;
private Boolean[] m_ParaBool;
private Byte[][] m_ParaBytes;
private Boolean m_IsChanged;
private Byte[] m_DataBytes; // reference the bytes which contain serialized data of current message.
#endregion private void SerializeData()
{
Encoding StrEncoder = null;
Int32 DataBuffLen = 0;
Int32 DataBuffOffset = 0;
Byte[] TempParaBytes = null;
List<Byte[]> ParaBytesList = null; StrEncoder = Encoding.UTF8;
DataBuffLen = 1; // set 1 to DataBuffLen is for length of MessageType
ParaBytesList = new List<Byte[]>(); for (Int32 i = 0; i < m_ParaString.Length; i++)
{
TempParaBytes = StrEncoder.GetBytes(m_ParaString[i]);
ParaBytesList.Add(BitConverter.GetBytes((UInt16)TempParaBytes.Length));
ParaBytesList.Add(TempParaBytes);
DataBuffLen += 2 + TempParaBytes.Length;
} DataBuffLen += m_ParaInt.Length * 4;
for (Int32 i = 0; i < m_ParaInt.Length; i++)
ParaBytesList.Add(BitConverter.GetBytes(m_ParaInt[i])); DataBuffLen += m_ParaBool.Length * 1;
for (Int32 i = 0; i < m_ParaBool.Length; i++)
ParaBytesList.Add(BitConverter.GetBytes(m_ParaBool[i])); for (Int32 i = 0; i < m_ParaBytes.Length; i++)
{
TempParaBytes = m_ParaBytes[i];
ParaBytesList.Add(BitConverter.GetBytes((UInt16)TempParaBytes.Length));
ParaBytesList.Add(TempParaBytes);
DataBuffLen += 2 + TempParaBytes.Length;
} m_DataBytes = new Byte[DataBuffLen];
m_DataBytes[0] = (Byte)m_MsgType;
DataBuffOffset = 1;
for (Int32 i = 0; i < ParaBytesList.Count; i++)
{
TempParaBytes = ParaBytesList[i];
Array.Copy(TempParaBytes, 0, m_DataBytes, DataBuffOffset, TempParaBytes.Length);
DataBuffOffset += TempParaBytes.Length;
} m_IsChanged = false;
} private void DeserializeData()
{
Encoding StrEncoder = null;
Int32 DataBuffOffset = 0;
Int32 ParaLength = 0; StrEncoder = Encoding.UTF8;
DataBuffOffset = 1; for (Int32 i = 0; i < m_ParaString.Length; i++)
{
ParaLength = BitConverter.ToUInt16(m_DataBytes, DataBuffOffset);
DataBuffOffset += 2;
m_ParaString[i] = StrEncoder.GetString(m_DataBytes, DataBuffOffset, ParaLength);
DataBuffOffset += ParaLength;
} for (Int32 i = 0; i < m_ParaInt.Length; i++)
{
m_ParaInt[i] = BitConverter.ToInt32(m_DataBytes, DataBuffOffset);
DataBuffOffset += 4;
} for (Int32 i = 0; i < m_ParaBool.Length; i++)
{
m_ParaBool[i] = BitConverter.ToBoolean(m_DataBytes, DataBuffOffset);
DataBuffOffset += 1;
} for (Int32 i = 0; i < m_ParaBytes.Length; i++)
{
ParaLength = BitConverter.ToUInt16(m_DataBytes, DataBuffOffset);
DataBuffOffset += 2;
m_ParaBytes[i] = new Byte[ParaLength];
Array.Copy(m_DataBytes, DataBuffOffset, m_ParaBytes[i], 0, ParaLength);
DataBuffOffset += ParaLength;
} m_IsChanged = false;
}
}
如果要传递一个class对象的话,就没那么简单了哦.只能用内存来序列化
XML序列化...SOAP序列化...交换标准...看MSDN去...
关于WCF就不是很清楚了。
序列化再反序列化就对了啊