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

C# socket传输对象问题

谁能帮忙看下这段代码有没有问题啊,为什么传过去后反序列化总是不行。
要传输对象的类 
[Serializable]
        public class Head
        {
            public int MessageLength;
            public uint CommandID;
            public int[] SequenceNumber = new int[3];
        }
客户端:

int[] sn = { 1, 1, 1 };
Head bindHead = new Head();
 {
                bindHead.MessageLength = 61;
                bindHead.CommandID = 0x1;
                sn.CopyTo(bindHead.SequenceNumber, 0);
  }
byte[] headSendStream = new byte[1024];
headSendStream = ObjectToBytes(bindHead);
mySocket.Send(headSendStream, headSendStream.Length, SocketFlags.None);
服务器:
byte[] result = new byte[1024];
int receiveNumber = myClientSocket.Receive(result);
Head head=new Head();
head = (Head)BytesToObject(result); 
 序列化:
        public static byte[] ObjectToBytes(object obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(ms, obj);
                return ms.GetBuffer();
            }
        }
反序列化:
        public static object BytesToObject(byte[] Bytes)
        {
            using (MemoryStream ms = new MemoryStream(Bytes))
            {
                ms.Position = 0;
                IFormatter formatter = new BinaryFormatter();
                return formatter.Deserialize(ms);
            }
        } --------------------编程问答-------------------- 在反序列化的组建里面没有 Head 这个类的引用。添加进来就应该没有错了。 --------------------编程问答-------------------- 除非双方都用WCF或DotNet Remoting,一般用BinaryFormatter来做网络传输不是好的主意。
反过来,如果用上了WCF或Remoting,一般也不用自己来做传输了:)  --------------------编程问答--------------------
引用 1 楼 love_4023 的回复:
在反序列化的组建里面没有 Head 这个类的引用。添加进来就应该没有错了。

反序列化的组建里有啊 --------------------编程问答-------------------- 嗯,奉劝你使用json或者xml。从性能上说,json要比xml好很多。 --------------------编程问答--------------------
引用 楼主 u010821592 的回复:
谁能帮忙看下这段代码有没有问题啊,为什么传过去后反序列化总是不行。
要传输对象的类 
[Serializable]
        public class Head
        {
            public int MessageLength;
            public uint CommandID;
            public int[] SequenceNumber = new int[3];
        }
客户端:

int[] sn = { 1, 1, 1 };
Head bindHead = new Head();
 {
                bindHead.MessageLength = 61;
                bindHead.CommandID = 0x1;
                sn.CopyTo(bindHead.SequenceNumber, 0);
  }
byte[] headSendStream = new byte[1024];
headSendStream = ObjectToBytes(bindHead);
mySocket.Send(headSendStream, headSendStream.Length, SocketFlags.None);
服务器:
byte[] result = new byte[1024];
int receiveNumber = myClientSocket.Receive(result);
Head head=new Head();
head = (Head)BytesToObject(result); 
 序列化:
        public static byte[] ObjectToBytes(object obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(ms, obj);
                return ms.GetBuffer();
            }
        }
反序列化:
        public static object BytesToObject(byte[] Bytes)
        {
            using (MemoryStream ms = new MemoryStream(Bytes))
            {
                ms.Position = 0;
                IFormatter formatter = new BinaryFormatter();
                return formatter.Deserialize(ms);
            }
        }

都用上了字节转输了为啥不直接使用 int to byte[]  long to byte[] 把对应的值写到字节数组中。再通过Socket转这样是最省资源的。

BinaryWriter 这个个将每个的值写到字节数组中,对方接收到后再用BinayReader再读取出来,
条件是你要先定义好每个包的协议 --------------------编程问答-------------------- 这步转换失败?

head = (Head)BytesToObject(result); 

补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,