我的一个朋友有一个有趣的问题。由于某些日志记录原因,他在会话中存储了一些复杂的对象,他必须将它们全部序列化并将它们保存在数据库中。
我们尝试过 XMLSerializer、NewtonSoft,但我们无法序列化“所有内容”。有没有一种方法可以序列化对象中的任何东西?
例如,我们无法序列化 IList、IEnumerable 等类型的属性。
有什么建议吗?
我的一个朋友有一个有趣的问题。由于某些日志记录原因,他在会话中存储了一些复杂的对象,他必须将它们全部序列化并将它们保存在数据库中。
我们尝试过 XMLSerializer、NewtonSoft,但我们无法序列化“所有内容”。有没有一种方法可以序列化对象中的任何东西?
例如,我们无法序列化 IList、IEnumerable 等类型的属性。
有什么建议吗?
您不能序列化“所有内容”,因为并非所有内容都是可序列化的。
特别是,您不能序列化接口,例如 IList。
哈哈,当我读到“如何序列化所有内容”这个问题时,我咯咯地笑了
我认为你可以创建一个自定义的 JsonConverter 来检测“Unserializable”类型并将它们转换为“serializable”,或者在这种情况下你甚至可以自己编写对象。
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (object is INotSerializableDontEvenTry)
{
INotSerializableDontEvenTry dontEvenTry = (INotSerializableDontEvenTry) object;
writer.WriteStartObject();
writer.WritePropertyName(dontEvenTry.Name);
serializer.Serialize(writer, dontEvenTry.Value);
writer.WriteEndObject();
}
else
{
base.WriteJson(writer, value, serializer);
}
}
搜索JSON.NET Implementing Custom Serialization
,你会发现很多资源可以帮助你。我只是在脑海中写下这个(和一些谷歌),我没有测试它,但它应该可以工作......
我相信只有具体的类型可以序列化 - 即将 IList、IEnumerable 等转换为要序列化的值对象中的“列表”类型。
您可以尝试使用类似这样的包装器序列化:
[Serializable] public class Wrapper{
public readonly object InnerObject;
public Wrapper(object InnerObject){
this.InnerObject = InnerObject;
}
}
但是请不要尝试序列化非托管的东西或任何包含非托管代码的东西,比如那些:
Stream
Process
Method
Task
Thread
delegate
...
但托管代码可以。