首页 > 解决方案 > C# Json接口序列化父子

问题描述

这可能有一个简单/快速的解决方案,但根据我的调查,我没能找到它。

   public interface IBaseMessage
   {

   }

   public interface IRefreshMessage : IBaseMessage
   {

   }

两者都由 Library.Message 中的具体类实现

它们存储在 a 中List<IBaseMessage>,当我序列化要通过网络发送的对象(一个接一个)时,它被标记为IBaseMessage甚至很难IRefrehMessage

问题:在反序列化(在另一台 PC 上)时,它们被重建,IBaseMessage并且所有信息IRefreshMessage都丢失了。

假设:我相信必须有一些 JSON 类属性允许我指定要序列化的内容?

谢谢,很抱歉提出一个相当愚蠢的问题

编辑:

使用这个类来序列化/反序列化:

using Newtonsoft.Json.Linq;
public class JMessage
{
   public Type Type { get; set; }
   public JToken Value { get; set; }

   public static JMessage FromValue<T>(T value)
   {
       return new JMessage { Type = typeof(T), Value = JToken.FromObject(value) };
   }

   public static string Serialize(JMessage message)
   {
      return JToken.FromObject(message).ToString();
   }

   public static JMessage Deserialize(string data)
   {
      return JToken.Parse(data).ToObject<JMessage>();
   }  

一次是调用

string data = JMessage.Serialize(JMessage.FromValue(message));

我得到:

{
  "Type": "Universal_Tool_Manager.Messages.Message.Interfaces.IBaseMessage, Universal Tool Manager.Messages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
  "Value": {
    "Propagation": 2,
    "State": 0
  }
}

希望这可以帮助。

标签: c#jsonserializationinterface

解决方案


JSON.NET 允许您指定如何使用以下方式处理序列化和反序列化JsonSerializerSettings

class Program
{
    static void Main(string[] args)
    {
        var items = new List<Test>
        {
            new Test() {Hello = "Hi"},
            new TestDerived() {Hello = "hello", Second = "World"}
        };
        var settings = new JsonSerializerSettings() 
        {
             TypeNameHandling = TypeNameHandling.Objects
        };
        var text = JsonConvert.SerializeObject(items, settings);
        var data = JsonConvert.DeserializeObject<IEnumerable<Test>>(text, settings);
    }
}

public class Test
{
    public string Hello { get; set; }
}

public class TestDerived : Test
{
    public string Second { get; set; }
}

在此示例中,生成的 JSON 将包含已序列化的实际类型的名称,并且 JSON.NET 将使用此信息反序列化回正确的派生类型 -data[1]TestDerived我的示例代码中。

要使用JsonSerializerSettingswithFromObjectParse方法,您需要创建一个实例JsonSerializer

var serializer = sonSerializer.Create(settings);
JToken.FromObject(o, serializer)
//and
JToken.Parse(data).ToObject<JMessage>(serializer);

推荐阅读