Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中的XmlSerializer,反序列化一个由多个XmlElement修饰的类,这些XmlElement通过一个特定属性具有相同的名称?_C#_Xml_Deserialization_Xmlserializer_Xml Attribute - Fatal编程技术网

在C#中的XmlSerializer,反序列化一个由多个XmlElement修饰的类,这些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

我有一个用错误的方式用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找到的是

[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序列化/反序列化,不包括字段