2017-06-04 224 views
0

[解決] 時發生錯誤,反序列化類型「消息」的目的。在根級別的數據無效反序列化時C#的DataContractSerializer異常「中的數據在根級別是無效的」

我有一個序列化下面的代碼/反序列化

public static byte[] Serialize(object Object) 
    { 
     using (var memoryStream = new MemoryStream()) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(Object.GetType()); 
      serializer.WriteObject(memoryStream, Object); 
      return memoryStream.ToArray(); 
     } 
    } 

    public static Type Deserialize<Type>(byte[] SerializedData) 
    { 
     using (var memoryStream = new MemoryStream(SerializedData)) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(Type)); 
      return (Type)serializer.ReadObject(memoryStream); 
     } 
    } 

這是我序列化

[DataContractAttribute] 
public class Message 
{ 
    public string MessageType = string.Empty; 
    public string MessageData = string.Empty; 
} 

這裏的類是如何使用它



    void Send(string MessageType, string Data) 
    { 
     Message message = new Message(); 
     message.MessageType = MessageType; 
     message.MessageData = Data; 
     byte[] byteData = Serializer.Serialize(message); // SERIALIZE 

     // Send the data 
     stream.Write(byteData, 0, byteData.Length); 
    } 

    Message Receive() 
    { 
     stream.Read(bytes, 0, bytes.Length); 
     Message message = Serializer.Deserialize(bytes); // DESERIALIZE 
     return message; 
    } 

我嘗試了幾個不同的東西,我已經找到了g oogle來自類似的問題,但我無法解決這個問題。我序列化的方式有什麼問題嗎?

+0

1)如何被定義了'stream'構件? Send()'和Receive()'中的Stream實例是否相同?如果是這樣,你是否記得倒回如圖所示的流。 [這裏](https://stackoverflow.com/a/40296891/3744182)。 2)你的Message類型沒有[數據成員屬性](https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx),所以它的任何屬性都不會被序列化。 – dbc

+0

這個流是一個NetworkStream,它是一個獨立的實例,一個在服務器上,另一個在客戶端。 – MuzzyA

回答

1

[解決]

有兩個問題。第一個問題是[DataContractAttribute]必須是[Serializable接口]

[Serializable] 
public class Message 
{ 
    public string MessageType = string.Empty; 
    public string MessageData = string.Empty; 
} 

二是涉及在上面的代碼中不可見的東西。 「字節」數組已初始化爲大於所接收數據的大小,導致解串器無法正常工作。

我剛創建具有適當大小的新數據陣列傳遞到解串器

Message Receive() 
{ 
    int messageLength = stream.Read(bytes, 0, bytes.Length); 
    byte[] data = new byte[messageLength]; 
    Array.Copy(bytes, data, messageLength); 

    Message message = Serializer.Deserialize(data); // DESERIALIZE 
    return message; 
} 
相關問題