数组序列化问题

时间:2014-06-21 19:36:27

标签: c# arrays serialization abstract binaryformatter

我在序列化数组时遇到问题。这些是在运行时之前未知的对象数组,除了它们将是抽象类DataItem的实例,它实现了ISerializable并具有Seri​​alizable属性。

当序列化数据包时,这些数组在一个名为DataPile的对象中被序列化。

我的序列化代码如下所示:

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    // ...
    List<DataItem> data = new List<DataItem>(dataCount);
    // ... build data list ...
    Type type = CurTypes[root.Key]; // determine type of DataItem
    Array dyndata = Array.CreateInstance(type, data.Count);
    for (int i = 0; i < data.Count; i++)
        dyndata.SetValue(data[i], i);
    info.AddValue("data", dyndata, type);
    // ...
}

我的反序列化代码如下所示:

public DataPile(SerializationInfo info, StreamingContext context)
{
    // ...
    // somestring refers to a string calculated via other objects
    // in info (specifically a string array)
    Type type = CurTypes["somestring"];        // typeof(class)
    Type type2 = CurTypes["somestring" + 'x']; // typeof(class[])
    dynamic data = info.GetValue("data", type2);
    items = (DataItem[])Array.CreateInstance(type, someSize);
    // populate items from data
    // ...
}

变量项的类型为DataItem[]。它是DataPile的私有成员,它以远程类似哈希表的方式存储大部分DataPile的实际信息。变量root的类型为DataNode,这在这里没有太大影响。 root的密钥(字符串)可用于查找派生类的类型,这就是相关的。

CurTypes是一本字典。它的目的应该是明确的。

问题是数据总是被反序列化为空数组。

如果我单步执行代码,在序列化中我可以在立即窗口中看到info.GetValue("data", whatever-type-I'm-currently-testing)不是空数组,而是完全是我想要它的数组。但是,一旦在反序列化中调用相同的代码,该数组具有正确数量的元素,但都为null。

我正在使用二进制格式化程序来序列化DataPile(相反,一个对象被序列化,它有许多序列化的DataPiles,每个都有自己的DataPile派生类)。有问题的对象被序列化为通过File.Open(path, FileMode.Create)创建的流。据我所知,除了这个功能之外的所有功能都可以正确地序列化到同一个文件,同样反序列化。

我在这段代码中遇到了很长时间的问题,直到最近,甚至无法让代码执行而没有错误。我通过this上的代码来到这里。

修改:Nevermind

0 个答案:

没有答案