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>,