【发布时间】:2011-11-25 21:30:03
【问题描述】:
我有一个实现 IEnumerable 的集合类,但在反序列化相同的序列化版本时遇到问题。我正在使用 Json.net v 4.0.2.13623
这是我的集合类的简化版本,它说明了我的问题
public class MyType
{
public int Number { get; private set; }
public MyType(int number)
{
this.Number = number;
}
}
public class MyTypes : IEnumerable<MyType>
{
private readonly Dictionary<int, MyType> c_index;
public MyTypes(IEnumerable<MyType> seed)
{
this.c_index = seed.ToDictionary(item => item.Number);
}
public IEnumerator<MyType> GetEnumerator()
{
return this.c_index.Values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public int CustomMethod()
{
return 1; // Just for illustration
}
}
当我序列化它时,我得到以下 json
[
{
"Number": 1
},
{
"Number": 2
}
]
但是当我尝试反序列化时,我得到以下异常 System.Exception:无法创建和填充列表类型 MyTypes
也尝试过使用序列化提示,但没有成功
这些是我用过的测试功能
public void RoundTrip()
{
var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });
var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented);
var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent);
}
public void RoundTripWithSettings()
{
var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });
var _serializationSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Arrays };
var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented, _serializationSettings);
var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent, _serializationSettings);
}
有没有人设法序列化他们自己的集合对象?
提前致谢
拍拍
【问题讨论】:
-
您应该序列化和反序列化到具体的集合,例如 List
而不是 IEnumerable 。要反序列化某些东西,它需要一个实现,而不仅仅是一个接口。 -
克里斯,通过其他一些更改更改为 ReadOnlyCollection
的子类,但我可以知道反序列化集合 -
其实你也可以使用 IList
。它将为您创建一个 List 。但是没有为 IEnumerable 定义默认集合。
标签: c# json serialization json.net