在C#中的XmlSerializer,反序列化一个由多个XmlElement修饰的类,这些XmlElement通过一个特定属性具有相同的名称?
我有一个用错误的方式用XmlElement修饰的类,但它也有一些属性,可以让我识别所需的字段 我只能修改[IWantToSerializeThisAttribute]并向MySerializableClass添加其他属性,因为对属性名称或XmlElement名称的任何修改都会涉及大量的编码维护 下面是类的定义方式:在C#中的XmlSerializer,反序列化一个由多个XmlElement修饰的类,这些XmlElement通过一个特定属性具有相同的名称?,c#,xml,deserialization,xmlserializer,xml-attribute,C#,Xml,Deserialization,Xmlserializer,Xml Attribute,我有一个用错误的方式用XmlElement修饰的类,但它也有一些属性,可以让我识别所需的字段 我只能修改[IWantToSerializeThisAttribute]并向MySerializableClass添加其他属性,因为对属性名称或XmlElement名称的任何修改都会涉及大量的编码维护 下面是类的定义方式: [XmlRoot("ARandomXmlRoot")] public class MySerializableClass { //CAMPI DI
[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找到的是
[XmlElement("DocumentCode")]
看到它是一个重复的标签
不管怎样,我有一个
[IWantToSerializeThisAttribute]
这使得这两个属性不同
我能告诉你XmlSerializer.Deserialize只捕获“IwantToSerializeThisAttribute”属性并对其进行值化,而忽略其他属性吗
我无法使用XmlOverrideAttributes更改序列化,但在反序列化过程中可能有某种方法可以做到这一点
谢谢大家尝试使用XmlOverrideAttributes和Reflection。使用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);
};
string XmlString=“XML HERE”;
XmlAttributeOverrides overrides=新的XmlAttributeOverrides();
//选择我不想序列化的字段,因为它们引发异常
字符串[]属性=(新的MySerializableClass())
.GetType().GetProperties()
.Where(p=>!Attribute.IsDefined(p,typeof(IWantToSerializeThisAttribute)))
.选择(p=>p.Name);
//向它们添加XmlIgnore属性
properties.ToList().ForEach(field=>overrides.Add(typeof(MySerializableClass),field,newXMLAttributes(){XmlIgnore=true});
MySerializableClass doc=新的MySerializableClass();
XmlSerializer serializerObj=新的XmlSerializer(typeof(MySerializableClass),重写);
使用(StringReader=新的StringReader(xmlString))
{
doc=(MySerializableClass)serializerObj.反序列化(reader);
};
干杯不确定我是否理解正确,但让我试着给你一些选择: 我能告诉你XmlSerializer.Deserialize只捕获“IwantToSerializeThisAttribute”属性并对其进行值化,而忽略其他属性吗 如果只想序列化特定属性,请为要忽略的属性使用
[XmlIgnore]
属性。但是如果出于某种原因(DOC\u code\u针对员工
和DOC\u ID\u针对员工
)
但是,如果您的意思是在反序列化时应该只忽略它,但是仍然应该对所有属性执行序列化,那么我会考虑实现
IXmlSerializable
。通过这种方式,您可以明确地提供您希望如何读取/写入xml。如果xml标记出现的次数超过了您需要的数组:[XmlElement(“DocumentId”)]public List DOC_ID{get;set;}的次数,那么显而易见的答案是删除该属性,因为您不希望使用它。为什么在不想序列化的属性上有一个XmlElement
属性?向我们展示您的xml。这就是我要找的,因为只有当我需要用XmlAttributeOverrides解决它时,才允许我执行动态xml序列化/反序列化,不包括字段