如何序列化所有内容

本文关键字:序列化 | 更新日期: 2023-09-27 18:11:00

我的一个朋友有一个有趣的问题。他有一些复杂的对象存储在他的会话中,由于一些日志原因,他必须将它们全部序列化,并将它们持久化在数据库中。

我们已经尝试XMLSerializer, NewtonSoft,但我们无法序列化"一切"。有没有一种方法可以序列化对象中的任何东西?

例如,我们不能序列化IList、IEnumerable等类型的属性。

有什么建议吗?

如何序列化所有内容

你不能序列化"everything",因为不是所有的东西都是可序列化的。

特别是,您不能序列化接口,如IList。

哈哈,当我读到"如何序列化所有东西"这个问题时,我咯咯地笑了起来

我认为你可以创建一个自定义的JsonConverter,它可以检测"不可序列化"类型,并将它们转换为"可序列化"的类型,或者在这种情况下,你甚至可以自己编写对象。

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