red*_*t84 20 .net c# ienumerable json.net xamarin.ios
我有一个项目,目前正在使用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; }
}
Run Code Online (Sandbox Code Playgroud)
到目前为止它工作正常.
为了使迭代更简单,我创建了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; }
}
Run Code Online (Sandbox Code Playgroud)
但是它无法反序列化对象.该错误令人困惑,因为它说它不能反序列化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; }
}
Run Code Online (Sandbox Code Playgroud)
示例项目:https://www.dropbox.com/s/27i58aiz71dylkw/IEnumerableJson.zip
Bri*_*ers 28
IEnumerable,Lists和Arrays
.NET列表(从IEnumerable继承的类型)和.NET数组转换为JSON数组.由于JSON数组仅支持一系列值而不支持属性,因此.NET集合上声明的任何其他属性和字段都不会序列化.在不需要JSON数组的情况下,JsonObjectAttribute可以放在实现IEnumerable的.NET类型上,以强制将类型序列化为JSON对象.
换句话说,由于你的类实现IEnumerable<T>,Json.Net认为它是一个列表.要解决这个问题,只需使用[JsonObject]属性装饰您的类.这将迫使Json.Net将其序列化并反序列化为普通类,这是您在这种情况下所需的.
[JsonObject]
public class EnumerableFoo : IEnumerable<Bar>
{
...
}
Run Code Online (Sandbox Code Playgroud)