有一个简单/快速的解决方案,但从我的调查中我没有找到它。
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
。
要将JsonSerializerSettings
与FromObject
和Parse
方法一起使用,您需要创建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(),
对不起菜鸟的错误