Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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#-反序列化XML-XmlText将获取Null,而不是字符串本身_C#_Xml_Parsing_Serialization - Fatal编程技术网

C#-反序列化XML-XmlText将获取Null,而不是字符串本身

C#-反序列化XML-XmlText将获取Null,而不是字符串本身,c#,xml,parsing,serialization,C#,Xml,Parsing,Serialization,我正在尝试从字符串解析XML消息。 我得到的线索是- <Instance_Updated> <Instance> <Field Name="INSTANCE_LABEL">00010541</Field> <Field Name="MAT_ID">TEST</Field> <Field Name="DEVICE_ID">TEST</Field> </Instanc

我正在尝试从字符串解析XML消息。 我得到的线索是-

<Instance_Updated>
  <Instance>
    <Field Name="INSTANCE_LABEL">00010541</Field>
    <Field Name="MAT_ID">TEST</Field>
    <Field Name="DEVICE_ID">TEST</Field>
  </Instance>
  <Item>
    <Field Name="MATERIAL_ID">TEST</Field>
    <Field Name="TITLE">TEST</Field>
    <Field Name="ON_AIR_DURATION">A</Field>
  </Item>
</Instance_Updated>

00010541
试验
试验
试验
试验
A.
InstanceUpdate类本身是:

    [XmlType("Instance_Updated"), Serializable]
    public class InstanceUpdated : SnellMessage
    {
        public InstanceUpdated()
        {
            InstanceFields = new List<Field>()
            {
                new Field() { Name = "INSTANCE_LABEL" },
                new Field() { Name = "MAT_ID" },
                new Field() { Name = "DEVICE_ID" }
            };

            ItemFields = new List<Field>()
            {
                new Field() { Name = "MATERIAL_ID" },
                new Field() { Name = "TITLE" },
                new Field() { Name = "ON_AIR_DURATION" }
            };
        }

        [XmlArray("Instance")]
        [XmlArrayItem("Field")]
        public List<Field> InstanceFields { get; set; }

        [XmlArray("Item")]
        [XmlArrayItem("Field")]
        public List<Field> ItemFields { get; set; }
   }

    [XmlType("Field"), Serializable]
    public class Field
    {
        [XmlAttribute("Name")]
        public string Name { get; set; }

        [XmlText]
        public string Value { get; set; }
    }
[XmlType(“实例_更新”),可序列化]
公共类实例已更新:SnellMessage
{
public InstanceUpdated()
{
InstanceFields=新列表()
{
新字段(){Name=“INSTANCE_LABEL”},
新字段(){Name=“MAT_ID”},
新字段(){Name=“DEVICE_ID”}
};
ItemFields=新列表()
{
新字段(){Name=“MATERIAL_ID”},
新字段(){Name=“TITLE”},
新字段(){Name=“ON\u AIR\u DURATION”}
};
}
[XmlArray(“实例”)]
[XmlArrayItem(“字段”)]
公共列表实例字段{get;set;}
[XmlArray(“项”)]
[XmlArrayItem(“字段”)]
公共列表项字段{get;set;}
}
[XmlType(“字段”),可序列化]
公共类字段
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlText]
公共字符串值{get;set;}
}
当我试图解析消息时-

InstanceUpdated instanceUpdatedMessage = SnellMessage.Deserialize<InstanceUpdated>(i_RootMessage.ToString()); 
instanceUpdatedInstanceUpdatedMessage=SnellMessage.Deserialize(i_RootMessage.ToString());
在“Field”对象中,我得到的是NULL值,而不是字符串本身

例如: 我假设字段“INSTANCE_LABEL”的Value属性应该是“00010541”,但在里面我得到一个空值


这是为什么?

问题不在于
字段.Value的值返回空值。问题是您正在为
InstanceUpdated
的构造函数中分配
InstanceFields
ItemFields
列表,然后
XmlSerializer
追加XML文件中的反序列化字段。如果重新序列化XML,您将看到每个字段都已重复:

  <Instance>
    <Field Name="INSTANCE_LABEL" />
    <Field Name="MAT_ID" />
    <Field Name="DEVICE_ID" />
    <Field Name="INSTANCE_LABEL">00010541</Field>
    <Field Name="MAT_ID">TEST</Field>
    <Field Name="DEVICE_ID">TEST</Field>
  </Instance>

00010541
试验
试验
样品

有关发生这种情况的原因的解释,请参阅

您的解决方案包括:

  • 将集合初始化移出构造函数并移入某个工厂

  • 序列化代理项数组属性。由于阵列是只读的,因此阵列在完全填充后必须回滚,例如:

    [XmlIgnore]
    public List<Field> InstanceFields { get; set; }
    
    [XmlArray("Instance")]
    [XmlArrayItem("Field")]
    public Field [] InstanceFieldsArray
    {
        get
        {
            if (InstanceFields == null)
                return null;
            return InstanceFields.ToArray();
        }
        set
        {
            (InstanceFields = InstanceFields ?? new List<Field>()).Clear();
            InstanceFields.AddRange(value ?? Enumerable.Empty<Field>());
        }
    }
    
    [XmlIgnore]
    公共列表实例字段{get;set;}
    [XmlArray(“实例”)]
    [XmlArrayItem(“字段”)]
    公共字段[]InstanceFieldsArray
    {
    得到
    {
    if(InstanceFields==null)
    返回null;
    返回InstanceFields.ToArray();
    }
    设置
    {
    (InstanceFields=InstanceFields??新建列表()).Clear();
    InstanceFields.AddRange(值??Enumerable.Empty());
    }
    }
    
    样品


谢谢,我删除了InstanceUpdate的构造函数,XmlSerializer自己添加了所有字段。