C# 中的 XmlSerializer,通过特定属性反序列化装饰有多个具有相同名称的 XmlElement 的 class?
XmlSerializer in C#, deserialize a class decorated with multiple XmlElement with same name by a particular attribute?
我有一个 class 以错误的方式用 XmlElement 装饰,但它也有一些属性可以让我识别我需要的字段。
我只能修改 [IWantToSerializeThisAttribute] 并将其他属性添加到 MySerializableClass,因为对 属性 名称或 XmlElement 名称的任何修改都将涉及繁重的编码维护工作。
class 的定义如下:
[XmlRoot("ARandomXmlRoot")]
public class MySerializableClass
{
//CAMPI DIR_DOCUMENTI
//[MetadatoDocumentoAlfresco] è un attributo che serve per selezionare i campi per l'aggiornamento dati massivo su alfresco
[IWantToSerializeThisAttribute]
[XmlElement("DocumentCode")]
public string DOC_CODE { get; set; }
[IWantToSerializeThisAttribute]
[XmlElement("DocumentId")]
public string DOC_ID { get; set; }
[XmlElement("DocumentCode")]
public string DOC_CODE_FOR_EMPLOYEES { get; set; }
[XmlElement("DocumentId")]
public string DOC_ID_FOR_EMPLOYEES { get; set; }
}
现在,如果我这样做
XmlSerializer.Deserialize(xmlString, typeof(MySerializableClass));
我很可能会收到一个错误,因为 XmlSerializer 找到的是
的 2 倍
[XmlElement("DocumentCode")]
发现这是一个重复的标签。
反正我有一个
[IWantToSerializeThisAttribute]
这使得 2 个属性不同。
我能否以某种方式告诉 XmlSerializer.Deserialize 只捕获和评估 "IwantToSerializeThisAttribute" 属性而忽略其他属性?
我无法使用 XmlOverrideAttributes 更改序列化,但也许在反序列化过程中有一些方法可以做到这一点。
谢谢大家
尝试使用 XmlOverrideAttributes 和反射。使用 LINQ 只是为了让它更短。
这对我有用:
string XmlString = "<ARandomXmlRoot> XML HERE </ARandomXmlRoot>";
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
//Select fields I DON'T WANT TO SERIALIZE because they throw exception
string[] properties = (new MySerializableClass())
.GetType().GetProperties()
.Where(p => !Attribute.IsDefined(p, typeof(IWantToSerializeThisAttribute)))
.Select(p => p.Name);
//Add an XmlIgnore attribute to them
properties.ToList().ForEach(field => overrides.Add(typeof(MySerializableClass), field, new XmlAttributes() { XmlIgnore = true }));
MySerializableClass doc = new MySerializableClass();
XmlSerializer serializerObj = new XmlSerializer(typeof(MySerializableClass), overrides);
using (StringReader reader = new StringReader(xmlString))
{
doc = (MySerializableClass)serializerObj.Deserialize(reader);
};
干杯
不确定我是否理解正确,但让我试着给你一些选择:
Can I tell someway XmlSerializer.Deserialize to catch and valorize only the "IwantToSerializeThisAttribute" properties and ignore the others?
如果您只想序列化特定属性,请对要忽略的属性使用 [XmlIgnore]
属性。但是如果出于某种原因 (DOC_CODE_FOR_EMPLOYEES
and DOC_ID_FOR_EMPLOYEES
)
但是如果你的意思是它应该只在反序列化时被省略,但仍然应该对所有属性进行序列化,我会考虑实现 IXmlSerializable
。通过这种方式,您可以具体提供您希望如何 read/write 您的 xml.
我有一个 class 以错误的方式用 XmlElement 装饰,但它也有一些属性可以让我识别我需要的字段。
我只能修改 [IWantToSerializeThisAttribute] 并将其他属性添加到 MySerializableClass,因为对 属性 名称或 XmlElement 名称的任何修改都将涉及繁重的编码维护工作。
class 的定义如下:
[XmlRoot("ARandomXmlRoot")]
public class MySerializableClass
{
//CAMPI DIR_DOCUMENTI
//[MetadatoDocumentoAlfresco] è un attributo che serve per selezionare i campi per l'aggiornamento dati massivo su alfresco
[IWantToSerializeThisAttribute]
[XmlElement("DocumentCode")]
public string DOC_CODE { get; set; }
[IWantToSerializeThisAttribute]
[XmlElement("DocumentId")]
public string DOC_ID { get; set; }
[XmlElement("DocumentCode")]
public string DOC_CODE_FOR_EMPLOYEES { get; set; }
[XmlElement("DocumentId")]
public string DOC_ID_FOR_EMPLOYEES { get; set; }
}
现在,如果我这样做
XmlSerializer.Deserialize(xmlString, typeof(MySerializableClass));
我很可能会收到一个错误,因为 XmlSerializer 找到的是
的 2 倍[XmlElement("DocumentCode")]
发现这是一个重复的标签。
反正我有一个
[IWantToSerializeThisAttribute]
这使得 2 个属性不同。
我能否以某种方式告诉 XmlSerializer.Deserialize 只捕获和评估 "IwantToSerializeThisAttribute" 属性而忽略其他属性?
我无法使用 XmlOverrideAttributes 更改序列化,但也许在反序列化过程中有一些方法可以做到这一点。
谢谢大家
尝试使用 XmlOverrideAttributes 和反射。使用 LINQ 只是为了让它更短。
这对我有用:
string XmlString = "<ARandomXmlRoot> XML HERE </ARandomXmlRoot>";
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
//Select fields I DON'T WANT TO SERIALIZE because they throw exception
string[] properties = (new MySerializableClass())
.GetType().GetProperties()
.Where(p => !Attribute.IsDefined(p, typeof(IWantToSerializeThisAttribute)))
.Select(p => p.Name);
//Add an XmlIgnore attribute to them
properties.ToList().ForEach(field => overrides.Add(typeof(MySerializableClass), field, new XmlAttributes() { XmlIgnore = true }));
MySerializableClass doc = new MySerializableClass();
XmlSerializer serializerObj = new XmlSerializer(typeof(MySerializableClass), overrides);
using (StringReader reader = new StringReader(xmlString))
{
doc = (MySerializableClass)serializerObj.Deserialize(reader);
};
干杯
不确定我是否理解正确,但让我试着给你一些选择:
Can I tell someway XmlSerializer.Deserialize to catch and valorize only the "IwantToSerializeThisAttribute" properties and ignore the others?
如果您只想序列化特定属性,请对要忽略的属性使用 [XmlIgnore]
属性。但是如果出于某种原因 (DOC_CODE_FOR_EMPLOYEES
and DOC_ID_FOR_EMPLOYEES
)
但是如果你的意思是它应该只在反序列化时被省略,但仍然应该对所有属性进行序列化,我会考虑实现 IXmlSerializable
。通过这种方式,您可以具体提供您希望如何 read/write 您的 xml.