【发布时间】:2019-12-08 22:25:11
【问题描述】:
反序列化 json 对象时如何获得相同的对象类型? ArrayList 丢失并反序列化为对象数组,矩形完全丢失。
编辑:我无法更改对象类型,有效负载必须是对象类型,我不知道其中有什么。我只添加了其中包含的 1 个数据示例,但它会有所不同。
public static void Run()
{
Int32 retval = 0;
ArrayList list = new ArrayList();
list.Add(retval);
list.Add(new Rectangle(1, 1, 1, 1));
Bar bar = new Bar()
{
MessageType = Bar.MessageTypes.Msg1,
Payload = list
};
Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings()
{
TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
};
var json1 = Newtonsoft.Json.JsonConvert.SerializeObject(bar);
var temp1 = Newtonsoft.Json.JsonConvert.DeserializeObject<Bar>(json1);
var json2 = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(bar);
var temp2 = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Bar>(json2);
}
public class Bar
{
public enum MessageTypes
{
Msg1 = 1,
Msg2 = 2
}
public MessageTypes MessageType { get; set; }
public Object Payload { get; set; }
}
【问题讨论】:
-
“获取相同的对象”是什么意思?当然,您永远不会得到相同的对象,您构建新对象,您正在创建一个深度克隆。由于这是打算在两台不同的计算机上发生的,因此甚至不可能出现不同的行为。如果在传输过程中丢失了某些东西,请检查您的字符串,它是在写入字符串时丢失,还是在从字符串加载回内存的途中丢失?
-
我说的是相同的对象类型而不是实例,类型丢失了
-
你不会丢失任何东西,不知道你说的“得到同一个对象”是什么意思。
-
List、Array、Arraylist 或通常的集合在 JSON 中只有一种表示形式。当然,您可以更改对象类型,它是一个文本文件,文本文件由一侧定义。如果一方放入一个数组,另一方会得到一个列表——没关系,这就是 xml/json 背后的全部想法。文本是固定的 - 没有别的,不是对象类型。如果您愿意,还可以保存一个 int 并加载一个 long。通常你甚至不使用相同的语言,一端运行 PHP,另一端运行 C#。那么现在呢?