4

ShouldSerialize*パターンを機能させる方法はありDataContractSerializerますか?

ここに小さな例があります:

私は次のような単純なクラスを持ってPersonいます:

[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()
  {
  }
}

FirstNameまたはLastName、nullまたは空でない場合にのみシリアル化する必要があります。これは動作しXmlSerializerますが、パターンDataContractSerializerを無視しているようです。パターンも機能しませんShouldSerialize*Specified

2つの異なるXmlファイルを作成しています。1つはDataContractSerializerを使用し、もう1つはXmlSerializerを使用します。

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)の出力は次のようになります。

<?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)の出力は次のようになります。

<?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>
4

2 に答える 2

5

AFAIK、ShouldSerialize*はデータコントラクトシリアライザーでは機能しません。ケビンの答えでは役に立たない。削除できます。残念ながら、指定されたコードは、null値を処理する場合にのみ機能します。

より一般的な解決策は次のとおりです。特定の条件に応じてnull値を返します。

    [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;
        }
      }
    }
于 2014-04-28T08:32:13.637 に答える
4

DataMemberでIsRequired属性を設定する必要があります。

[DataContract]
public class Person
{
  [DataMember(IsRequired = False, EmitDefaultValue = False)]
  public string FirstName { get; set; }
  ...
}
于 2012-07-09T12:02:54.820 に答える