反序列化时的C#DataContractSerializer异常'根级别的数据无效'

时间:2017-06-04 16:34:33

标签: c# serialization datacontractserializer

[解决] 反序列化' Message'类型的对象时出错。根级别的数据无效

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

import numpy as np
import pandas as pd
import seaborn.apionly as sns
import matplotlib.pyplot as plt

iterables = [[2016, 2017], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
index = pd.MultiIndex.from_product(iterables, names=['Year', 'Month'])
df = pd.DataFrame({"values":np.random.rand(24)}, index=index)

df2 = df.reset_index()  # or, df.reset_index(inplace=True) if df is not required otherwise 

g = sns.lmplot(x="Month", y="values", data=df2, hue="Year")

plt.show()

这是我正在序列化的课程

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

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

1 个答案:

答案 0 :(得分:1)

<强> [解决]

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

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

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

我刚创建了一个具有相应大小的新数据数组,以传递给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;
}