C# Json 接口序列化父子项


这可能

有一个简单/快速的解决方案,但从我的调查中我没有找到它。

   public interface IBaseMessage
   {
   }
   public interface IRefreshMessage : IBaseMessage
   {
   }

两者都是由库中的具体类实现的。

它们存储在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
  }
}

希望这有帮助。

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

要将JsonSerializerSettingsFromObjectParse方法一起使用,您需要创建JsonSerializer的实例:

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

我在这里问了错误的问题:)

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

问题出在typeof(T)上,当然它将始终返回基本接口IBaseInterface,因为我使用的是

List<IBaseInterface>, 

解决方案是使用价值。GetType(),

对不起菜鸟的错误

最新更新