【问题标题】:How to serialize everything如何序列化所有内容
【发布时间】:2013-04-26 19:23:54
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

  • 旁注:在会话中保留复杂对象是个坏主意。 保留复杂的对象是个坏主意。检索它们,处理/操作/输出,更新/保存,你就完成了。
  • 好吧,这不是我的代码,而且这个要求现在才出现 :) 你说得对,我们应该重构这段代码,但那是一条漫长的道路 :)
  • @Steve - 感谢您纠正错字。
  • 这些类型无法序列化,因为它们没有任何显式数据。

标签: c# serialization


【解决方案1】:

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

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

【讨论】:

  • Awww.. 真的吗?这太令人失望了=(。我本来希望在家中序列化我的鼓,将它们放在笔式驱动器中带到办公室,然后在午餐时间将它们反序列化以播放一些曲调=(
  • 所以我只是在想我的朋友是否可以在运行时使用反射创建其他属性,然后从“I”类型的属性中填充这些新创建的属性,但是反序列化逻辑也会很麻烦。
  • @HighCore 或者...您可以将自己序列化,这样您就可以在午餐时间送自己回家并在那里播放一些曲子,然后在回去工作之前小睡一下。
  • 对像 IList 这样的接口的引用只是对实现接口功能的东西的引用。它只是行为 - 没有数据。可能根本没有要序列化的内容。
【解决方案2】:

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

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

【讨论】:

  • 最终使用 Json.net 和 newton soft!。谢谢!
【解决方案3】:

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

【讨论】:

  • 不,我不能更改类型定义。
  • 不可能序列化接口类型 - 不幸的是它的工作方式。
【解决方案4】:

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

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

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

Stream
Process
Method
Task
Thread
delegate
...

但托管代码也可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多