2017-06-04 177 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; 
} 
相关问题