【发布时间】: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