我有一个客户端应用程序提供给我的C#应用程序的XML文档.这是客户端发送XML文件的方式:
<?xml version="1.0" encoding="utf-8"?>
<SomeAccount>
<parentId>2380983</parentId>
<!-- more elements -->
</SomeAccount>
Run Code Online (Sandbox Code Playgroud)
还有一个支持XML反序列化的C#类:
[XmlRoot]
public class SomeAccount
{
[XmlElement("parentId")]
public long ParentId { get; set; }
//rest of fields...
}
Run Code Online (Sandbox Code Playgroud)
但是有一些客户端的系统以这种方式发送XML(请注意大写LeParentId):
<?xml version="1.0" encoding="utf-8"?>
<SomeAccount>
<LeParentId>2380983</LeParentId>
<!-- similar for the other elements -->
</SomeAccount>
Run Code Online (Sandbox Code Playgroud)
如何使这个字段(和其他字段)支持XML名称parentId和LeParentId?
这是我目前用于XML反序列化的方法:
public sealed class XmlSerializationUtil
{
public static T Deserialize<T>(string xml)
{
if (xml == null)
return default(T);
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringReader stringReader = new StringReader(xml);
return (T)serializer.Deserialize(stringReader); …Run Code Online (Sandbox Code Playgroud) 我们在项目中广泛使用xml序列化/反序列化来在多个应用程序之间传递数据.我们有一个共同的xsd,我们生成c#类,然后使用XmlSerializer从xml转到对象并返回.
我们遇到的问题是,当一个应用程序更新为添加新的枚举值但另一个应用程序尚未更新时.现在,未更新的应用程序尝试反序列化xml并失败,因为它不知道新的枚举.
如果我们有app1和app2,那么现场工作正常,那么app2将在xsd中使用新的枚举值进行更新,并在字段中更新到客户端.突然app1中断因为它不知道枚举,app1甚至可能不使用该枚举字段,对app1没有影响,但它仍然会中断.
有没有任何已知的方法.基本上我想要做的是定义当找不到枚举时做什么,使用默认值或者如果枚举为nullible类型并将其设置为null.
XmlSerializer和DataContractSerializer抛出异常都是这种情况.
我查看了自定义xml序列化项目YAXLib(http://www.codeproject.com/KB/XML/yaxlib.aspx),这也引发了异常,但是有源代码并且可以更改.该项目使用不同的属性属性,需要进行相当多的更改,但可能是可行的.
任何其他建议.