【发布时间】:2021-11-10 23:17:19
【问题描述】:
我有一个项目目前正在使用 Json.Net 进行 Json 反序列化类,如下所示:
public class Foo {
public Guid FooGuid { get; set; }
public string Name { get; set; }
public List<Bar> Bars { get; set; }
}
public class Bar {
public Guid BarGuid { get; set; }
public string Description { get; set; }
}
到目前为止一切正常。
为了让迭代更简单,我让Foo 类实现IEnumerable<Bar>,如下所示:
public class Foo : IEnumerable<Bar> {
public Guid FooGuid { get; set; }
public string Name { get; set; }
public List<Bar> Bars { get; set; }
public IEnumerator<Bar> GetEnumerator()
{
return Bars.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class Bar {
public Guid BarGuid { get; set; }
public string Description { get; set; }
}
但是它反序列化对象失败。该错误令人困惑,因为它表示它无法反序列化 FooGuid 字段,但删除 IEnumerable 接口再次起作用。
模拟器或设备中的 MonoTouch 和 MonoDroid 环境中的问题是相同的。
关于如何使它工作的任何线索?
添加了重现此问题的代码:
public static class Tests {
public static void SerializeAndDeserializeFoo() {
// Serialize and deserialize Foo class
var element = new Foo
{
FooGuid = Guid.NewGuid(),
Name = "Foo name",
Bars = new List<Bar> {
new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" },
new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" },
new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" }
}
};
var serializedObject = JsonConvert.SerializeObject(element);
Console.WriteLine("Serialized Foo element: {0}", serializedObject);
// Exception if Foo implements IEnumerable
var deserializedObject = JsonConvert.DeserializeObject<Foo>(serializedObject);
Console.WriteLine("Foo deserialization worked!");
}
public static void SerializeAndDeserializeEnumerableFoo() {
// Serialize and deserialize Foo class
var element = new EnumerableFoo
{
FooGuid = Guid.NewGuid(),
Name = "Foo name",
Bars = new List<Bar> {
new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" },
new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" },
new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" }
}
};
var serializedObject = JsonConvert.SerializeObject(element);
Console.WriteLine("Serialized EnumerableFoo element: {0}", serializedObject);
try {
// Exception if Foo implements IEnumerable
var deserializedObject = JsonConvert.DeserializeObject<EnumerableFoo>(serializedObject);
Console.WriteLine("EnumerableFoo deserialization worked!");
}
catch (Exception e){
Console.WriteLine("EnumerableFoo deserialization failed!");
throw;
}
}
}
public class EnumerableFoo : IEnumerable<Bar> {
public Guid FooGuid { get; set; }
public string Name { get; set; }
public List<Bar> Bars { get; set; }
public IEnumerator<Bar> GetEnumerator()
{
return Bars.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class Foo {
public Guid FooGuid { get; set; }
public string Name { get; set; }
public List<Bar> Bars { get; set; }
}
public class Bar {
public Guid BarGuid { get; set; }
public string Description { get; set; }
}
示例项目:https://www.dropbox.com/s/27i58aiz71dylkw/IEnumerableJson.zip
【问题讨论】:
-
发布一个自包含的可编译代码怎么样?因为我无法复制它。
-
@L.B 添加了示例代码和示例项目。
-
你不需要实现
IEnumerable<Bar>。只要把这个方法public IEnumerator GetEnumerator() { return Bars.GetEnumerator(); }放到EnumerableFoo(去掉其他GetEnumerators) ,它就可以在foreach -
JSON.net 文档 (james.newtonking.com/json/help/index.html?topic=html/…) 讨论了序列化 IEnumerables 的限制。
标签: c# .net xamarin.ios json.net ienumerable