首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ShouldSerialize模式和DataContractSerializer

ShouldSerialize模式和DataContractSerializer
EN

Stack Overflow用户
提问于 2012-07-09 20:00:19
回答 2查看 5K关注 0票数 4

有没有一种方法可以让DataContractSerializer使用ShouldSerialize*模式?

下面是一个小示例:

我有一个简单的Person类,如下所示:

代码语言:javascript
复制
[DataContract]
public class Person
{
  [DataMember]
  public string FirstName { get; set; }
  public bool ShouldSerializeFirstName()
  {
    return !string.IsNullOrEmpty(FirstName);
  }

  [DataMember]
  public string LastName { get; set; }
  public bool ShouldSerializeLastName()
  {
    return !string.IsNullOrEmpty(LastName);
  }

  public Person(string firstName, string lastName)
  {
    FirstName = firstName;
    LastName = lastName;
  }
  public Person(string firstName)
  {
    FirstName = firstName;
  }
  public Person()
  {
  }
}

仅当FirstNameLastName不为null或空时,才应序列化它们。这适用于XmlSerializer,但DataContractSerializer似乎忽略了ShouldSerialize模式。*Specified模式也不起作用。

我正在创建两个不同的Xml文件。一个使用DataContractSerializer,另一个使用XmlSerializer:

代码语言:javascript
复制
List<Person> persons = new List<Person>();
persons.Add (new Person("John", "Doe"));
persons.Add (new Person("Carl"));

DataContractSerializer serializer = new DataContractSerializer (typeof (List<Person>));
using (XmlWriter writer = XmlWriter.Create(@"c:\test1.xml", settings))
{
  serializer.WriteObject (writer, persons);
}

XmlSerializer xmlSerializer = new XmlSerializer (typeof (List<Person>));
XmlWriter xmlWriter = XmlWriter.Create (@"c:\text2.xml", settings);
xmlSerializer.Serialize (xmlWriter, persons);
xmlWriter.Close();

文件test1.xml (DataContractSerializer)的输出如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XmlSerialization">
  <Person>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
  </Person>
  <Person>
    <FirstName>Carl</FirstName>
    <LastName i:nil="true" />
  </Person>
</ArrayOfPerson>

文件test2.xml (XmlSerializer)的输出如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Person>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
  </Person>
  <Person>
    <FirstName>Carl</FirstName>
  </Person>
</ArrayOfPerson>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-28 16:32:14

AFAIK,ShouldSerialize*不适用于数据合约序列化程序。在Kevin的回答中它是无用的。您可以将其删除。不幸的是,给定的代码只有在处理空值时才起作用。

这里有一个更通用的解决方案:它根据给定的条件返回空值。

代码语言:javascript
复制
    [DataContract]
    public class Person
    {
      private string firstName;
      [DataMember(IsRequired = false, EmitDefaultValue = false)]
      public string FirstName
      {
        get
        {
            //Put here any condition for serializing
            return string.IsNullOrWhiteSpace(firstName) ? null : firstName;
        }
        set
        {
            firstName = value;
        }
      }
    }
票数 5
EN

Stack Overflow用户

发布于 2012-07-09 20:02:55

您应该在DataMember上设置IsRequired属性:

代码语言:javascript
复制
[DataContract]
public class Person
{
  [DataMember(IsRequired = False, EmitDefaultValue = False)]
  public string FirstName { get; set; }
  ...
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11394587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档