【发布时间】:2020-03-24 02:28:26
【问题描述】:
为什么我在类的第一个实现中出现反序列化异常“找不到反序列化类型为'SerializeTest.TryMe'的对象的构造函数”,但在第二个实现中却没有?
第一次实现:
[Serializable]
public class TryMe : IDictionary<int, string>
{
Dictionary<int, string> _dictionary = new Dictionary<int, string>();
public TryMe() {}
public IEnumerator<KeyValuePair<int, string>> GetEnumerator()
{
return _dictionary.GetEnumerator();
}
// all other IDictionary members are implemented below...
......
}
第二次实施:
[Serializable]
public class TryMe : Dictionary<int, string>
{
public int Dummy { get; set; } = 5;
public TryMe() {}
}
序列化/反序列化代码:
var tryMe = new TryMe();
tryMe[5] = "a"; tryMe[9] = "b"; tryMe[4] = "c";
using (var fs = new FileStream(@"D:\11.obj", FileMode.Create))
{
var formatter = new BinaryFormatter();
formatter.Serialize(fs, tryMe);
}
tryMe = null;
using (var fs = new FileStream(@"D:\11.obj", FileMode.Open))
{
var formatter = new BinaryFormatter();
tryMe = (TryMe)formatter.Deserialize(fs); // Exception here with 2nd implementation of TryMe!!
}
除了序列化问题之外,我应该何时更喜欢继承 IDictionary 以及何时应该继承 Dictionary?
对此有规范的方式/规则吗?
【问题讨论】:
-
@LouisGo:详细说明:我的问题是为什么我必须在一种情况下添加 ctor
public TryMe(SerializationInfo info, StreamingContext context) : base(info, context) { }而在另一种情况下不需要? -
IDictionary实现由类自己处理,而Dictionary序列化实现不是由TryMe完成的。如果TryMe未指定,序列化程序如何知道将字典密钥对数据放在哪里?
标签: c# dictionary serialization deserialization