【问题标题】:How to serialize/deserialize an ArrayList and properties that are of an Object type如何序列化/反序列化 ArrayList 和 Object 类型的属性
【发布时间】: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#。那么现在呢?

标签: c# json json.net


【解决方案1】:

它不能反序列化,因为它不知道它需要序列化到的类型。 不要使用 ArrayList,尝试指定有效负载的属性。像这样的东西应该可以工作:

public enum MessageTypes
{
    Msg1 = 1,
    Msg2 = 2
}

public class PayLoad
{
    public int Foo { get; set; }
    public Rectangle Rectangle { get; set; }
}

public class Bar
{
    public MessageTypes MessageType { get; set; }
    public PayLoad Payload { get; set; }
}

【讨论】:

    【解决方案2】:

    我决定改用soap序列化,因为它将类型添加到xml中

      using System;
      using System.Text;
      using System.IO;
      using System.Runtime.Serialization.Formatters;
      using System.Runtime.Serialization.Formatters.Soap;
    
      namespace Utils
      {
         public class XMLUtil
         {
            public static Byte[] StringToUTF8ByteArray(String xmlString)
            {
               return new UTF8Encoding().GetBytes(xmlString);
            }
    
            public static String SerializeToXML<T>(T objectToSerialize)
            {
               using (MemoryStream ms = new MemoryStream())
               using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
               {
                  SoapFormatter soapFormatter = new SoapFormatter();
                  soapFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
                  soapFormatter.Serialize(ms, objectToSerialize);
                  String decoded = Encoding.UTF8.GetString(ms.ToArray());
                  return decoded;
               }
            }
    
            public static T DeserializeFromXML<T>(string xmlString) where T : class
            {
               T retval = default(T);
               using (MemoryStream stream = new MemoryStream(StringToUTF8ByteArray(xmlString)))
               {
                  SoapFormatter soapFormatter = new SoapFormatter();
                  soapFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
                  retval = soapFormatter.Deserialize(stream) as T;
               }
               return retval;
            }
         }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      相关资源
      最近更新 更多