C#-反序列化XML-XmlText将获取Null,而不是字符串本身
我正在尝试从字符串解析XML消息。 我得到的线索是-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
<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自己添加了所有字段。