List< T>c#中无法正确反序列化的内部可序列化对象

本文关键字:反序列化 内部 对象 序列化 List | 更新日期: 2023-09-27 18:17:27

我在c#中有一个名为MyObject的对象,我一直在努力使它能够使我们可以将这个对象,序列化为JSON,使用该JSON填充JavaScript中的其他列表等,然后使用结果更改的JSON字符串反馈到MyObject对象并更改其值。然而,每当我在这个对象上调用Json()时,它都会给我正确序列化的Json,但是当我将确切的Json返回到UpdateFromJson(string Json)方法时,它会声明列表的count=0,并且我在新对象中没有得到任何列表对象。其他属性填充得很好;唯一的问题是列表。

这是一个(简化的)类,没有属性,但有相关的方法和对象列表。需要注意的是,List包含了我在命名空间的其他地方定义的对象,也就是说,它们不在c#框架的任何地方,它们是自定义的。

[Serializable]
public class MyObject
{
  public MyObject()
  {
    this.Elements = new List<MyObjectElement>();
  }
  public List<MyObjectElement> Elements { get; private set; }
  public string Json()
  {
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Serialize(this);
  }
  public void UpdateFromJson(string json)
  {
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new JavaScriptSerializer();
    MyObject temp = serializer.Deserialize<MyObject>(json);
    foreach (PropertyInfo property in temp.GetType().GetProperties())
    {
      object value = property.GetValue(temp, null);
      if (value != null)
      {
        if (value.GetType() == typeof (List<MyObjectElement>))
        {
          foreach(MyObjectElement le in (List<MyObjectElement>)value)
          {
            this.Elements.Add(le);
          }
        }
      }
      property.SetValue(this, value, null);
    }
  }
}

就像我说的,我唯一的问题是,例如当serializer.Deserialize<MyObject>(json)发生时,列表中没有任何内容,事实上,实际的JSON字符串(我已经将其打印到浏览器并在JSONLint中进行了测试)包含元素的数据。似乎Deserialize(json)无法以它可以解析的格式检索列表,或者其他东西,我不确定。

List< T>c#中无法正确反序列化的内部可序列化对象

正如Ralf所建议的,我将内部List的setter设置为private。我改变了它,它引发了一堆重构。最后发生的事情是,我选择为扩展MyObjectElement的每个类型提供显式列表,以便在序列化为JSON时,它可以反序列化而不会损失精度。

我猜typeof(List<MyObjectElement>)的平等检查是失败的。可能被反序列化的类型是array或IList或其他类型。你能不能用反序列化的对象来代替这个对象然后把它映射到对象之外?为什么要把它映射到自身呢?