如何在从类转换为 XML 时忽略可为空的整数

本文关键字:整数 XML 转换 | 更新日期: 2023-09-27 18:34:55

>我有一个WCF服务,它有:

[DataContract]
public class Attribute
{
      [DataMember]
       public string AttributeUsed1{ get; set; } 
       [DataMember]
       public string AttributeUsed2{ get; set; } 
       [DataMember]
       public string AttributeUsed3{ get; set; } 
       [DataMember(EmitDefaultValue = false)]
       public int AttributeNotUsed1{ get; set; } 
       [DataMember(EmitDefaultValue = false)]
       public int? AttributeNotUsed2{ get; set; } 
       [DataMember]
       public string AttributeNotUsed3{ get; set; } 
}

另外,我有一个Windows服务,它引用了上述网络服务。在此Windows服务中,我有一个自定义类对象,并将其转换为XML。

当我为自定义类构建对象时,我只为 AttributeUsed1、AttributeUsed2 和 AttributeUsed3 设置值。将对象序列化为 XML 后,我得到以下内容:

<AttributeUsed1>ABC</AttributeUsed1>
<AttributeUsed2>DEF</AttributeUsed2>
<AttributeUsed3>GHI</AttributeUsed3>
<AttributeNotUsed1>0<AttributeNotUsed1>
<AttributeNotUsed2>xsi: nil="true"</AttributeNotUsed2>

我想要的结果如下。我根本不希望显示整数变量。我怎样才能做到这一点?任何帮助将不胜感激!

  <AttributeUsed1>ABC</AttributeUsed1>
    <AttributeUsed2>DEF</AttributeUsed2>
    <AttributeUsed3>GHI</AttributeUsed3>

如何在从类转换为 XML 时忽略可为空的整数

我假设您根据对DataContractDataMember属性的使用来使用DataContractSerializer

如果您确实希望整数属性"根本不"序列化,无论它们的值是什么,只需用 [IgnoreDataMember]属性:

[IgnoreDataMember]
public int? AttributeNotUsed2{ get; set; } 

顺便说一句,当我使用 DataContractSerializer 按原样序列化您的类时,我没有看到AttributeNotUsed1AttributeNotUsed2。 我只看到与您应用的属性相对应的元素[DataMember(EmitDefaultValue = false)]

<Attribute>
    <AttributeNotUsed3 i:nil="true" />
    <AttributeUsed1 i:nil="true" />
    <AttributeUsed2 i:nil="true" />
    <AttributeUsed3 i:nil="true" />
</Attribute>

即您的[DataMember(EmitDefaultValue = false)]正在工作。 如果只想跳过发出默认值,请将相同的属性添加到AttributeNotUsed3即可完成。

另一方面,如果您实际上将XmlSerializer与 wcf 一起使用,则需要使用 XmlIgnore 标记您的属性:

[IgnoreDataMember]
[XmlIgnore]
public int? AttributeNotUsed2{ get; set; } 

应用这两个属性是安全的; DataContractSerializer忽略与XmlSerializer相关的属性,反之亦然。 您可以在此处阅读有关这两个序列化程序的更多信息。