C # десериализация через TCP - PullRequest
0 голосов
/ 01 сентября 2011

У меня теперь проблема с десериализацией объекта, отправленного по TCP.

При десериализации я получаю следующее исключение SerializationException (код ниже):

Дополнительная информация: двоичный поток '0' не содержит действительного BinaryHeader. Возможные причины: неверный поток или версия объекта изменение между сериализацией и десериализацией.

Сериализационный код:

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;
    }

Объекты сериализуются во время выполнения, поэтому я не думаю, что это проблема управления версиями. Я новичок в потоковой передаче и т. Д., Поэтому я мог упустить что-то очевидное.

Я хотел бы предложить, что я думаю, но я действительно застрял. :)

Спасибо.

1 Ответ

5 голосов
/ 01 сентября 2011

serializedObjectStream.Length является long.

Вы записываете 64-битное значение в сеть, но пытаетесь прочитать его как 32-битное int.

...