【问题标题】:C# DataContractSerializer exception when Deserializing 'The data at the root level is invalid'反序列化'根级别的数据无效'时的C#DataContractSerializer异常
【发布时间】:2017-06-04 16:34:32
【问题描述】:

[已解决] 反序列化“消息”类型的对象时出错。根级数据无效

我有以下用于序列化/反序列化的代码

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

我已经尝试了几种不同的东西,我在谷歌上发现了类似的问题,但我无法解决这个问题。我的序列化方式有问题吗?

【问题讨论】:

  • 1) stream 成员是如何定义的? Send()Receive() 中的 Stream 实例是否相同?如果是这样,您是否记得如图所示倒带流。 here。 2) 你的Message 类型没有data member attributes 所以它的所有属性都不会被序列化。
  • 流是一个NetworkStream,是一个单独的实例,一个在服务端,一个在客户端。

标签: c# serialization datacontractserializer


【解决方案1】:

[已解决]

有两个问题。第一个问题是 [DataContractAttribute] 需要是 [Serializable]

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

Second 与上面代码中不可见的内容有关。 'bytes' 数组被初始化为大于接收到的数据的大小,导致 Deserializer 无法正常工作。

我刚刚创建了一个具有适当大小的新数据数组以传递给反序列化器

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

【讨论】:

    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多