c#高效率传输一个对象?
大家好.我想问一下,如果用c#实现一个传一个对象.我现在是用先把这个对象序列化.然后指它转成流的形式,到了数据接收那里时,再反序列化这个对象.这样一来一回.我觉得这样比较浪费浪费资源.有否一些更直观的方法? --------------------编程问答-------------------- 没有.. --------------------编程问答-------------------- 而且是真的没有.--------------------编程问答-------------------- 可以说说你要做什么么?为什么会传对象? --------------------编程问答-------------------- 你可以自己实现一个简单的序列化方法,将一个对象转换成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;
}
} --------------------编程问答-------------------- 楼上的都是简单数据.
如果要传递一个class对象的话,就没那么简单了哦.只能用内存来序列化 --------------------编程问答-------------------- remoting好像可以做到,wcf好像也行,你看看去 --------------------编程问答-------------------- 嗯 .关注 --------------------编程问答-------------------- 二进制序列化...不支持异种系统...
XML序列化...SOAP序列化...交换标准...
看MSDN去... --------------------编程问答-------------------- 使用Remoting,其内部还是使用.Net里的序列化方式(Binary或SOAP)的。
关于WCF就不是很清楚了。 --------------------编程问答-------------------- 压缩 --------------------编程问答-------------------- .net Remoting
序列化再反序列化就对了啊
补充:.NET技术 , C#