我试图序列化和反序列化抽象
类的列表(必须继承
vb),显然里面只有派生类的实例。
我用JsonProperty(ItemTypeNameHandling=TypeNameHandling.Auto)
修饰了list参数,获得如下输出:
但是当我反序列化它时,我一直说他不能反序列化抽象类。
http://james.newtonking.com/json/help/index.html?topic=html/SerializeTypeNameHandling.htm
public class ConcreteClass
{
private ObservableCollection<AbstractClass> _Nodes = new ObservableCollection<AbstractClass>();
//<Newtonsoft.Json.JsonProperty(itemtypenamehandling:=Newtonsoft.Json.TypeNameHandling.Auto)>
public ObservableCollection<AbstractClass> Nodes {
get { return this._Nodes; }
}
public string Name { get; set; }
public int Id { get; set; }
}
public abstract class AbstractClass
{
private ObservableCollection<AbstractClass> _Nodes = new ObservableCollection<AbstractClass>();
[Newtonsoft.Json.JsonProperty(itemtypenamehandling = Newtonsoft.Json.TypeNameHandling.Auto)]
public ObservableCollection<AbstractClass> Nodes {
get { return this._Nodes; }
}
}
删除注释行它可以工作!
请确保在反序列化时根据以下文档指定TypeNameHandling:
// for security TypeNameHandling is required when deserializing
Stockholder newStockholder = JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
值得注意的是,留档反序列化了一个包含抽象类集合的具体类。
作为一个实验,尝试创建一个一次性类(具体类),该类在抽象对象列表中有一个属性,看看是否可以序列化和反序列化该类。
更新:
我刚刚在LINQPad中测试了以下代码:
void Main()
{
var test = new List<Business>();
test.Add(new Hotel { Name = "Hilton", Stars = 5 });
test.Add(new Pool { Name = "Big Splash", Capacity = 500 });
test.Dump();
string json = JsonConvert.SerializeObject(test, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
json.Dump();
var businesses = JsonConvert.DeserializeObject<List<Business>>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
businesses.Dump();
}
// Define other methods and classes here
public abstract class Business
{
public string Name { get;set; }
}
public class Hotel : Business
{
public int Stars { get;set; }
}
public class Pool : Business
{
public int Capacity { get;set;}
}
它完美地工作。摘要集合序列化到:
{
"$type": "System.Collections.Generic.List`1[[UserQuery+Business, query_jvrdcu]], mscorlib",
"$values": [
{
"$type": "UserQuery+Hotel, query_jvrdcu",
"Stars": 5,
"Name": "Hilton"
},
{
"$type": "UserQuery+Pool, query_jvrdcu",
"Capacity": 500,
"Name": "Big Splash"
}
]
}
原始集合和反序列化的集合匹配。
FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的
上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能
本文向大家介绍什么是序列化与反序列化?相关面试题,主要包含被问及什么是序列化与反序列化?时的应答技巧和注意事项,需要的朋友参考一下 序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流 反序列化:将流转换为对象。 这两个过程结合起来,可以轻松地存储和传输数据。
我在我的应用程序中使用、模块进行身份验证策略。我试图理解是否还需要使用和方法。据我所知,这些方法使用会话来存储用户信息。我怀疑使用已经实现了使用这些方法的目的。还是我在这里完全错了? 如果我的假设错了,请指正。
我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。 我的对象看起来像这样。 我希望有一种方法可以将其映射到json,看起来像: 我们希望能够做到这一点,以便我们可以将属性添加到列表中。
本文向大家介绍.net的序列化与反序列化实例,包括了.net的序列化与反序列化实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了.net的序列化与反序列化的实现方法。分享给大家供大家参考。具体方法如下: 1.序列化与反序列化概述 C#中如果需要:将一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去,这时就需要用到序列化,反序列化(Serialization & De