c# - 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
}
}
希望这可以帮助。
解决方案
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
我的示例代码中。
要使用JsonSerializerSettings
withFromObject
和Parse
方法,您需要创建一个实例JsonSerializer
:
var serializer = sonSerializer.Create(settings);
JToken.FromObject(o, serializer)
//and
JToken.Parse(data).ToObject<JMessage>(serializer);
推荐阅读
- php - 使用mysql if语句更改按钮按下的值
- javascript - 如何使用threejs在html中上传STL文件
- python - 如何检查值是否与 txt 文件匹配
- node.js - iOS - App Store - 更改订阅的到期日期
- javascript - 反应路由器冲突两条路由
- haskell - 表示算术表达式
- angular - 在构建后或部署期间在 ngsw 中重新生成内容哈希
- angular - 使用“angular-auth-oidc-client”时,如何防止应用程序启动时的破坏性自动授权?
- azure - 在不使用注册策略的情况下将用户添加到 Azure B2C
- javascript - 当功能是不同的节点项目时,如何按顺序工作节点功能?