2

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

我们尝试过 XMLSerializer、NewtonSoft,但我们无法序列化“所有内容”。有没有一种方法可以序列化对象中的任何东西?

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

有什么建议吗?

4

4 回答 4

5

您不能序列化“所有内容”,因为并非所有内容都是可序列化的。

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

于 2013-04-26T19:26:47.080 回答
4

哈哈,当我读到“如何序列化所有内容”这个问题时,我咯咯地笑了

我认为你可以创建一个自定义的 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,你会发现很多资源可以帮助你。我只是在脑海中写下这个(和一些谷歌),我没有测试它,但它应该可以工作......

于 2013-04-26T19:40:06.530 回答
1

我相信只有具体的类型可以序列化 - 即将 IList、IEnumerable 等转换为要序列化的值对象中的“列表”类型。

于 2013-04-26T19:26:34.503 回答
1

您可以尝试使用类似这样的包装器序列化:

[Serializable] public class Wrapper{
    public readonly object InnerObject;
    public Wrapper(object InnerObject){
        this.InnerObject = InnerObject;
    }
}

但是请不要尝试序列化非托管的东西或任何包含非托管代码的东西,比如那些:

Stream
Process
Method
Task
Thread
delegate
...

但托管代码可以。

于 2019-09-08T02:21:22.090 回答