C#Json接口序列化父子

C#Json接口序列化父子,c#,json,serialization,interface,C#,Json,Serialization,Interface,这可能有一个简单/快速的解决方案,但从我的调查中,我没有找到它 public interface IBaseMessage { } public interface IRefreshMessage : IBaseMessage { } 两者都是由库中的具体类实现的 它们存储在列表中,当我序列化要通过网络发送的对象(一个接一个)时,它被标记为IBaseMessage,甚至有些是IRefrehMessage 问题:在反序列化时(在另一台PC上),它们被重建

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

   public interface IBaseMessage
   {

   }

   public interface IRefreshMessage : 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>();
   }  
我得到:

{
  "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.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; }
}

我在这里问错了问题:)

publicstaticjmessagefromvalue(T值)
{
返回新的JMessage{Type=**typeof(T)**,Value=JToken.FromObject(Value)};
}
问题出在typeof(T)上,因为我使用的是

List<IBaseInterface>, 
列表,
解决方案是使用value.GetType()


对于新手犯的错误,我深表歉意。

我在这里问错了问题:)

publicstaticjmessagefromvalue(T值)
{
返回新的JMessage{Type=**typeof(T)**,Value=JToken.FromObject(Value)};
}
问题出在typeof(T)上,因为我使用的是

List<IBaseInterface>, 
列表,
解决方案是使用value.GetType()


很抱歉犯了新手错误

除了缺少a(正如mjwills已经提到的),还完全不清楚您的问题是否与序列化有关(例如,json数据不包含IRefreshMessage特定的属性,或者包含关于IBaseMessage/IRefreshMessage的不正确类型信息)或者反序列化程序是否只是忽略json数据中特定于IRefreshMessage的属性。请编辑并改进您的问题,以添加理解问题所需的关键信息……除了缺少a(正如mjwills已经提到的)之外,还完全不清楚您的问题是否与序列化有关(例如,json数据不包含特定于IRefreshMessage的属性,或者包含与IBaseMessage/IRefreshMessage相关的不正确类型信息)或者反序列化程序是否只是忽略json数据中特定于IRefreshMessage的属性。请编辑并改进您的问题,以添加理解问题所需的关键信息…查看请将解决方案标记为答案,以便问题结束:-)请将解决方案标记为答案,以便问题结束:-)
List<IBaseInterface>,