TCP上的C#反序列化

TCP上的C#反序列化,c#,serialization,tcp,stream,C#,Serialization,Tcp,Stream,我现在在反序列化通过TCP发送的对象时遇到了一个问题 反序列化时,我得到以下SerializationException(以下代码): 其他信息:二进制流“0”不包含有效的 二进制头文件。可能的原因是流或对象版本无效 在序列化和反序列化之间进行更改 序列化代码: public static void SerializeRO(Stream stream, ReplicableObject ro) { MemoryStream serializedObjectStream =

我现在在反序列化通过TCP发送的对象时遇到了一个问题

反序列化时,我得到以下SerializationException(以下代码):

其他信息:二进制流“0”不包含有效的 二进制头文件。可能的原因是流或对象版本无效 在序列化和反序列化之间进行更改

序列化代码:

public static void SerializeRO(Stream stream, ReplicableObject ro) {
            MemoryStream serializedObjectStream = new MemoryStream();
            Formatter.Serialize(serializedObjectStream, ro);
            BinaryWriter bw = new BinaryWriter(stream);
            bw.Write(serializedObjectStream.Length);
            serializedObjectStream.WriteTo(stream);
            serializedObjectStream.Close();
            bw.Close();
        }
public static List<ReplicableObject> ParseStreamForObjects(Stream stream) {
        List<ReplicableObject> result = new List<ReplicableObject>();
        while (true) {
            if (!(stream as NetworkStream).DataAvailable) break;
            BinaryReader br = new BinaryReader(stream);
            int length = br.ReadInt32();
            byte[] bytes = br.ReadBytes(length);
            MemoryStream ms = new MemoryStream(bytes);
            ms.Position = 0;
                            // ERROR OCCURS ON THE LINE BELOW
            result.Add((ReplicableObject) Formatter.Deserialize(ms));
            ms.Close();
            br.Close();
        }
        return result;
    }
反序列化代码:

public static void SerializeRO(Stream stream, ReplicableObject ro) {
            MemoryStream serializedObjectStream = new MemoryStream();
            Formatter.Serialize(serializedObjectStream, ro);
            BinaryWriter bw = new BinaryWriter(stream);
            bw.Write(serializedObjectStream.Length);
            serializedObjectStream.WriteTo(stream);
            serializedObjectStream.Close();
            bw.Close();
        }
public static List<ReplicableObject> ParseStreamForObjects(Stream stream) {
        List<ReplicableObject> result = new List<ReplicableObject>();
        while (true) {
            if (!(stream as NetworkStream).DataAvailable) break;
            BinaryReader br = new BinaryReader(stream);
            int length = br.ReadInt32();
            byte[] bytes = br.ReadBytes(length);
            MemoryStream ms = new MemoryStream(bytes);
            ms.Position = 0;
                            // ERROR OCCURS ON THE LINE BELOW
            result.Add((ReplicableObject) Formatter.Deserialize(ms));
            ms.Close();
            br.Close();
        }
        return result;
    }
公共静态列表ParseStreamForObjects(流){
列表结果=新列表();
while(true){
如果(!(流作为网络流).DataAvailable)中断;
BinaryReader br=新的BinaryReader(流);
int length=br.ReadInt32();
byte[]bytes=br.ReadBytes(长度);
MemoryStream ms=新的MemoryStream(字节);
ms.Position=0;
//错误发生在下面的行上
Add((ReplicableObject)格式化程序.反序列化(ms));
Close女士();
br.Close();
}
返回结果;
}
这些对象在运行时被序列化,所以我认为这不是版本控制问题。我不熟悉流媒体等,所以我可能错过了一些明显的东西

我想提出我认为可能的建议,但我真的被卡住了。:)


谢谢。

serializedObjectStream.Length
是一个
长的


您正在向网络写入64位值,但尝试将其作为32位
int
序列化对象流读取。Length
是一个

您正在向网络写入一个64位值,但试图将其作为32位
int
读取