【问题标题】:Serializing a class using XMLSerializer not showing fields C#使用 XMLSerializer 序列化类而不显示字段 C#
【发布时间】:2017-05-07 11:58:02
【问题描述】:

我有一个具有两个属性的类(使用 xsd.exe 从 xsd 生成)并填充它们并尝试使用以下代码将它们序列化为 xml。

我能够获取包含元素的 xml,但没有我分配的字段/元素

OrganizationDetail objOrgDet = new OrganizationDetail();
objOrg.IsDataLimitedSet =true;

Organization objOrg = new Organization();
objOrg.Orgainzation_Detail = objOrgDet;

XmlSerializer serailizer = new XmlSerializer(typeof(Organization));
StringWriter strwritter = new StringWriter();

serailizer.Serialize(strwritter, objOrg);
string xml = strwritter.ToString();

而生成的 xml 是

<?xml version="1.0" encoding="utf-16"?>
<Organization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Organization_DETAIL xmlns="http://www.mismo.org/residential/2009/schemas" />
</Organization>

这没有我设置的字段。

【问题讨论】:

  • 您必须为您的属性DataLimited 提供一个值。我希望IsDataLimitedSet 是用XmlIgnore 装饰的,以防止它出现。
  • @rene 是的,我刚刚发现了,但是为什么要添加这个 System.Xml.Serialization.XmlIgnoreAttribute() 注释有什么线索?
  • 是的,IIRC 是为具有 xsi:nil="true" 或 minoccurs=0 并且映射到类上的非空类型的元素添加的。在反序列化期间,无论 Is[NameofProperty]Set 是真还是假,不可为空的类型都将具有其默认值,具体取决于有效负载中是否存在该元素。
  • 谢谢@rene,实际上我有 minoccurs=0 ,我认为这意味着如果未设置值,它将不会在 xml 中应用,但如果我们设置属性,它必须包含在内,所以我想知道获取具有 minOccurs=0 的属性的解决方案是什么?

标签: c# xml xsd xml-serialization xmlserializer


【解决方案1】:

正如 cmets 中所讨论的,当我们为元素添加 minOccurs=0 时,我们会得到注释 System.Xml.Serialization.XmlIgnoreAttribute(),因此即使在填充实体后我们也看不到属性

解决方案: 当您运行 xsd.exe 时具有属性 minOccurs=0 的字段在类中生成两个属性,一个是属性,另一个是具有后缀“指定”的属性的布尔值

所以为了让值在序列化时出现在 xml 中,我们需要启用该元素的 Specified 属性

例如: 因为我有属性IsDataLimitedSet,所以在类中还生成了一个名为IsDataLimitedSetSpecified的属性,所以我们需要将其设置为true

OrganizationDetail objOrgDet = new OrganizationDetail();
objOrg.IsDataLimitedSetSpecified =true;
objOrg.IsDataLimitedSet =true;

【讨论】:

    【解决方案2】:

    您需要用数据填充字段。序列化程序忽略所有未填充的字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2010-12-06
      • 2014-08-28
      • 2017-09-13
      相关资源
      最近更新 更多