我个人认为最好的途径是获得一个 XSD,如果你不能获得它,那么组成一个具有所有可能性的可序列化类,然后引用它。EG:你有两个领域,一个是有时设置的,一个是你从未见过的,但在规范中的某个地方可能会发生这种情况。
所以让我们组成一个假装类:
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace GenericTesting.Models
{
[Serializable()]
public class Location
{
[XmlAttribute()]
public int Id { get; set; }
[XmlAttribute()]
public double PercentUsed { get; set; }
[XmlElement]
public string ExtraGarbage { get; set; }
[XmlText]
public string UsedOnceInTheUniverse { get; set; }
}
}
为了序列化/反序列化的目的,让我为这些提供扩展方法:
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace GenericTesting
{
static class ExtensionHelper
{
public static string SerializeToXml<T>(this T valueToSerialize)
{
dynamic ns = new XmlSerializerNamespaces();
ns.Add("", "");
StringWriter sw = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(sw, new XmlWriterSettings { OmitXmlDeclaration = true }))
{
dynamic xmler = new XmlSerializer(valueToSerialize.GetType());
xmler.Serialize(writer, valueToSerialize, ns);
}
return sw.ToString();
}
public static T DeserializeXml<T>(this string xmlToDeserialize)
{
dynamic serializer = new XmlSerializer(typeof(T));
using (TextReader reader = new StringReader(xmlToDeserialize))
{
return (T)serializer.Deserialize(reader);
}
}
}
}
以及控制台应用程序中的一个简单主入口点:
static void Main(string[] args)
{
var locations = new List<Location>
{
new Location { Id = 1, PercentUsed = 0.5, ExtraGarbage = "really important I'm sure"},
new Location { Id = 2, PercentUsed = 0.6},
new Location { Id = 3, PercentUsed = 0.7},
};
var serialized = locations.SerializeToXml();
var deserialized = serialized.DeserializeXml<List<Location>>();
Console.ReadLine();
}
我知道这并不完全是您所要求的,但我个人认为良好的类型对于 XML 更好,并且您曾经处理过的任何第三方都应该至少有某种类型的规格表或关于他们给您的内容的详细信息。否则你正在失去标准。Xml 不应该通过反射或其他方式动态创建,因为它意味着如果有任何东西强制执行严格的类型(如果有的话)。