当前位置:编程学习 > C#/ASP.NET >>

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#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,