【发布时间】:2019-04-12 19:46:15
【问题描述】:
我尝试按照this post 中的说明实现反序列化,但没有成功:
(* 我正在使用 LinqPad 进行测试,这就是为什么您可以在我的示例末尾看到 .Dump() 调用)
在这段代码中,我收到“实例验证错误:'' is not a valid value for claves_sexo”,因为它是空的:
void Main()
{
string xmlString = "<Products><Product><Id>1</Id><Name>My XML product</Name><Sexo></Sexo></Product></Products>";
XmlSerializer serializer = new XmlSerializer(typeof(List<Product>), new XmlRootAttribute("Products"));
StringReader stringReader = new StringReader(xmlString);
List<Product> productList = (List<Product>)serializer.Deserialize(stringReader);
productList.Dump();
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public claves_sexo Sexo {get;set;}
}
public enum claves_sexo
{
HO,
MU,
ND
}
我希望 Product 的 Sexo 成员在未获通知时为枚举分配值 ND = 2。
我一直在玩 XmlIgnore 属性并创建了另一个成员来将空标记的值作为字符串导入,并将其分配给 Sexo 成员,但我没有成功。
- 有人要求我将 Sexo 成员的类型更改为 String,但我无法更改类型 claves_sexo,因为它属于我们使用的某个固定标准。
最后注:这是最终工作的版本:
void Main()
{
string xmlString = "<Products><Product><Id>1</Id><Name>My XML product</Name><Sexo>ND</Sexo></Product></Products>";
XmlSerializer serializer = new XmlSerializer(typeof(List<Product>), new XmlRootAttribute("Products"));
StringReader stringReader = new StringReader(xmlString);
List<Product> productList = (List<Product>)serializer.Deserialize(stringReader);
productList.Dump();
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
[XmlIgnore]
public claves_sexo Sexo {get;set;}
[XmlElement("Sexo")]
public string SexoAsString
{
get
{
return Sexo.ToString();
}
set
{
if (string.IsNullOrWhiteSpace(value))
{
Sexo = claves_sexo.ND;
}
else
{
Sexo = (claves_sexo)Enum.Parse(typeof(claves_sexo), value);
}
}
}
}
public enum claves_sexo
{
HO,
MU,
ND
}
谢谢大家!
罗杰
【问题讨论】:
-
我一直在玩XmlIgnore属性并创建了另一个成员来将空标签的值作为字符串导入,并将其分配给Sexo成员,但我没有成功 - 那么你能分享失败的尝试吗,即minimal reproducible example?它应该可以工作,参见例如XmlSerializer enumeration deserialization failing on (non existent) whitespace -- 假设你的 setter 当然会检查传入的空字符串。
-
在枚举定义中设置
ND = 0有帮助吗? -
@Aybe - 将
[DefaultValue(claves_sexo.ND)]添加到Sexo似乎没有帮助,请参阅dotnetfiddle.net/oDNFK5 -
添加代理字符串属性完全可行,请参阅dotnetfiddle.net/zaJR9a。不确定您的问题出在哪里。
标签: c# xml deserialization xmlserializer xml-deserialization