gpt4 book ai didi

c#-2.0 - 如何在 C# 中将两个不同的 xmls 文件反序列化为两个不同的类对象?

转载 作者:行者123 更新时间:2023-12-04 06:02:49 25 4
gpt4 key购买 nike

假设我在同一个程序集中有两个不同的 xml 文件作为嵌入式资源:

x.xml

<car brand="Hummer">
<type ... />
<chasis ... />
</car>

y.xml

<shark species="HammerHead">
<color ... />
<maxLen .... />
</shark>

我有两个类(class) Car.csShark.cs帮助反序列化它们。

将它们反序列化为两个不同且独立的对象的技术是什么?

以下代码一次只能处理一种类型。不是吗?

string[] manifestResourceNames = assembly.GetManifestResourceNames();        
foreach (string mrn in manifestResourceNames)
{
Stream stream = assembly.GetManifestResourceStream(mrn);
XmlSerializer serializer = new XmlSerializer(typeof(Car));
Car car = (Car)serializer.Deserialize(stream);
.... .... ....
}

并且,当这段代码会遇到 Shark -class,它会产生一个异常。

最佳答案

为了使系统在任何方面都可靠,您需要为 XML 命名(无论如何,您应该始终为 XML 命名空间 - 但我会为您省去咆哮)。所以:

<car xmlns="http://schemas.cars.org/car" brand="Hummer">
<type /> <chassis />
</car>
<shark xmlns="http://schemas.ocenia.org/predator">
<lazer-beams>1</lazer-beams>
<awesome>Hell yeah.</awesome>
</shark>

您的 C# XML 序列化属性将变为:

[XmlRoot("Car", Namespace=CarNamespaceUri)]
public class Car
{
public const string CarNamespaceUri = "http://schemas.cars.org/car";
// ...
}

在此之后,您将按照 XmlSerializerManager 的方式写一些东西。 .这将维护一个内部 Dictionary<Tuple<string, string>, XmlSerializer> - 您可以通过反射填充(查找应用了 XmlRootAttribute 的所有类型并根据 Namespace, LocalName 创建元组并为该类型实例化 XmlSerializer)。这可能是一个静态类。

要反序列化任何元素,您只需在字典中查找其名称和命名空间以检索 XmlSerializer实例。例如:

public static T Deserialize<T>(XElement element)
{
return (T)Deserialize(element);
}

public static object Deserialize(XElement element)
{
// Remember to do more elaborate checks etc.
using(var r = element.CreateReader())
{
return _serializers[Tuple.Create(element.Name.NamespaceName, element.Name.LocalName)].Deserialize(r);
}
}

关于c#-2.0 - 如何在 C# 中将两个不同的 xmls 文件反序列化为两个不同的类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8739573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com