我在序列化数组时遇到问题。这些是在运行时之前未知的对象数组,除了它们将是抽象类DataItem的实例,它实现了ISerializable并具有Serializable属性。
当序列化数据包时,这些数组在一个名为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。