XmlSerializer在C#中,用一个特定的属性反序列化一个具有相同名称的多个XmlElement装饰的类?
我有一个以错误的方式用XmlElement装饰的类,但它也具有可以让我识别我需要的字段的属性。XmlSerializer在C#中,用一个特定的属性反序列化一个具有相同名称的多个XmlElement装饰的类?
我只能修改[IWantToSerializeThisAttribute]并将其他属性添加到MySerializableClass,因为对属性名称或XmlElement名称的任何修改都会涉及繁重的代码维护。
这里是如何类已经被定义为:
[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和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);
};
干杯
这就是我正在寻找的,因为允许我仅在需要时才会执行动态xml序列化/反序列化,不包括字段 – Wasted
不知道如果我理解正确的,但让我尝试给你一些选项:
我能告诉好歹XmlSerializer.Deserialize只捕获和确定“IwantToSerializeThisAttribute”属性并忽略其他属性?
如果要仅序列化特定属性,请使用[XmlIgnore]
属性来指定要忽略的属性。但是,如果由于某种原因(DOC_CODE_FOR_EMPLOYEES
和DOC_ID_FOR_EMPLOYEES
)
但是,如果你的意思是,它应该反序列化只能省略,但系列化仍应为我想想实施IXmlSerializable
所有属性来完成。这样你可以专门提供你想要如何读/写你的XML。
使用XmlAttributeOverrides – Wasted
如果xml标签发生了两次比您需要的数组:[XmlElement(“DocumentId”)] public List DOC_ID {get;组; } –
jdweng
显而易见的答案是删除该属性,因为您不希望它被使用。为什么你不希望序列化的属性上有'XmlElement'属性? –
向我们展示您的xml。 –