我正在尝试序列化/反序列化包含Dictionary<Tuid,Section>
. 这些都是自定义类型。
在我的代码中,我有一种模板类型,其中包含Dictionary<Tuid,Section>
. 这是我试图序列化/反序列化的模板类。
为了解决这个集合是字典的问题,我ISerializable
在我的模板类上实现了接口......
[Serializable]
public class Template : ISerializable
{
protected Template(SerializationInfo info, StreamingContext context)
{
// Deserialize the sections
List<Tuid> tuids = (List<Tuid>)info.GetValue("Sections_Keys", typeof(List<Tuid>));
List<Section> sections = (List<Section>)info.GetValue("Sections_Values", typeof(List<Section>));
this._sections = new Dictionary<Tuid, Section>();
for (int i = 0; i < tuids.Count; i++)
{
_sections.Add(tuids[i], sections[i]);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
List<Tuid> tuids = new List<Tuid>();
List<Section> sections = new List<Section>();
foreach (KeyValuePair<Tuid, Section> kvp in _sections)
{
tuids.Add(kvp.Key);
sections.Add(kvp.Value);
}
info.AddValue("Sections_Keys", tuids, typeof(List<Tuid>));
info.AddValue("Sections_Values", sections, typeof(List<Section>));
}
这里的策略是将字典“解包”成两个单独的列表,并将它们单独存储在序列化流中。然后它们会在之后重新创建。
我的Section课程也实现ISerializable
了......
[Serializable]
public class Section : BaseObject
{
protected Section(SerializationInfo info, StreamingContext context):base(.....)
{
// Code
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// code
}
}
问题是当我在我的模板和GetObjectData()
我的部分上都调用序列化时,这让我相信数据是可序列化的并且它正在被序列化。
当我反序列化时,只会调用 Template 上的反序列化构造函数。Section 的反序列化构造函数永远不会被调用。这样做的结果是调用info.GetValue("Section_Values"....)
确实返回了一个 List,但其中有一个项目并且该项目为空。
为什么我的反序列化 Section 的构造函数永远不会被调用?会不会是部分里面的一些数据是不可序列化的?如果是这样,如何找出它不能序列化的究竟是什么?
更新:我刚刚发现的一件事是 BaseObject for section 被标记[Serializable]
但没有实现ISerializable
.
此外,我想知道 Deserialize 代码有多么繁琐——它是否会针对同时构造基类的构造函数?
更新..
好的,我已经将问题追溯到该部分的序列化。代码看起来像这样......
protected Section(SerializationInfo info, StreamingContext context):base(.....)
{
// Code
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
//info.AddValue("CustomObject", ClientInfo, typeof(CustomObject));
//info.AddValue("Description", Description, typeof(string));
}
注释掉这两行后,没有任何内容被序列化,并且调用了反序列化构造函数Section
。如果我添加字符串值,一切都很好。但是,是的 - 你猜对了 - 如果我将 加入CustomObject
到序列化流中,则不会调用反序列化构造函数。
注意...
- 我的反序列化构造函数
Section
是一个空白方法 - 我不尝试对反序列化数据做任何事情。 - Section 的基本构造函数已被删除以传入新的有效对象,我已经确认它运行良好。
- 没有抛出异常告诉我
CustomObject
无法序列化。 - 是可序列化的
CustomObject
,其GetObjectData()
方法运行良好,反序列化构造良好。
纯粹将这个可序列化对象添加到框架然后只是失败的反序列化器构造函数的流中似乎很奇怪Section
!
为什么这可能会发生?