如何序列化一切

时间:2013-04-26 19:23:55

标签: c# serialization

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

我们尝试过XMLSerializer,NewtonSoft但我们无法序列化“一切”。有没有办法可以序列化对象中的任何内容?

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

有任何建议吗?

4 个答案:

答案 0 :(得分:5)

您无法序列化“所有内容”,因为并非所有内容都可以序列化。

特别是,您无法序列化界面,例如IList。

答案 1 :(得分:3)

哈哈,当我读到“如何序列化一切”这个问题时,我咯咯地笑了起来。

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

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,您会发现很多资源可以帮助您解决这个问题。我只是写了这个(和一些谷歌),我没有测试它,但它应该工作...

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以尝试使用类似以下内容的包装器序列化:

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

但是请不要尝试序列化非托管内容或诸如此类的包含非托管代码的内容:

Stream
Process
Method
Task
Thread
delegate
...

但是托管代码可以。