【问题标题】:XML serialization without defining types不定义类型的 XML 序列化
【发布时间】:2013-09-11 15:43:41
【问题描述】:

有没有什么方法可以为 XML 序列化和反序列化构建一个通用方法,而不需要一堆体操,包括使用 XmlInclude 之类的东西预定义类型?我需要构建的代码不能依赖于预定义的类型。我假设反射可以在这里使用,但我找不到合适的解决方案。我从 NuGet 中尝试过的每个都有局限性:

  • Polenter 似乎产生无法反序列化的不可用输出
  • 全球,Netfx 需要提前定义类型
  • Bender 很漂亮,但似乎不支持嵌入在被序列化对象中的对象
  • XSerializer 和 JsonFX 是我在序列化方面需要的,但输出不会反序列化

标准 XmlSerializer 因显而易见的原因(预定义类型、XmlInclude 等)无法工作。

我需要序列化然后反序列化的简单示例:

    public class c1
    {
        public string name { get; set; }
        public object obj { get; set; }
    }

    public class c2
    {
        public string city { get; set; }
    }

    public static void Main(string[] args)
    {
        c1 class_1 = new c1();
        c2 class_2 = new c2();
        class_1.name = "david";
        class_2.city = "chicago";
        class_1.obj = class_2;

        string xml = <insert here>;
        Console.WriteLine("XML: " + xml);

        c1 deserialized = new c1();
        deserialized = <insert here>;
        Console.WriteLine("City: " + ((c2)c1.obj).city);
    }

这样的东西真的存在吗?

【问题讨论】:

  • 必须是xml吗?也许是 json?
  • 是的,我需要一个 XML 解决方案。我正在为 JSON 使用 Newtonsoft(而且效果很好)。
  • 我不太明白你的问题,你能不能让我说的清楚一点?
  • 是的,我想要一个不强制我传递类型参数并且不需要我使用 XmlInclude 的序列化器和反序列化器。请参阅 XSerializer 和 JsonFx 的 XML 序列化功能 - 它们工作得很好 - 但它们不会使用标准反序列化器进行反序列化。这部分很重要的原因是因为其他开发人员将使用序列化输出,并且他们可能使用标准 XmlSerializer。由于我不会进入这里的原因,我不能使用 XmlSerializer 进行序列化。
  • 序列化不会成为对象转换的问题,但反序列化会因为反序列化器不知道要使用什么类型。因此它将具有 c1.obj 的 xml,但它不知道要实例化什么类型,因为 c1.obj 是对象类型。它可以在反序列化上做的最好的事情是动态或扩展。您可以将类型信息写入 xml 文件,以便反序列化器知道要使用什么类型,但这很脏。我现在实际上正在为 Bender 添加对象支持,所以我很好奇你的用例。我也可能误解了你的问题。

标签: c# xml serialization xml-serialization


【解决方案1】:

我不确定您所说的“不定义类型”是什么意思。如果它是您的代码正在使用的对象,则它具有类型。最简单的做法是编写代码以针对 ISerializable - 然后它可以与 any 可序列化类型一起使用 - 即使是那些您的代码在构建时不知道的类型。或者,如果您正在使用动态对象(其成员在运行时定义的对象),请查看此问题以获取制作 ISerializable DynamicObject 的示例:https://stackoverflow.com/a/7501960/518955

【讨论】:

  • 谢谢 - 我知道这一点。这不是我需要的解决方案。我需要的解决方案就是我上面要求的。
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多