web-dev-qa-db-ja.com

DataContract、デフォルトのDataMember値

デシリアライズ中にxmlファイルにない属性のデフォルト値を選択する方法はありますか?
mAge属性がxmlファイルに存在しない場合、デフォルト値の18を使用したいと思います。それは可能ですか?

[DataContract]
public class Person 
{
    public Person ()
    {
    }
    [DataMember(Name = "Name")]
    public string mName { get; set; }
    [DataMember(Name = "Age")]
    public int mAge { get; set; }
    [DataMember(Name = "Single")]
    public bool mIsSingle { get; set; }
};

編集して答えを入れてください。

[DataContract]
public class Person 
{
    public Person ()
    {
    }
    [DataMember(Name = "Name")]
    public string mName { get; set; }
    [DataMember(Name = "Age")]
    public int? mAge { get; set; }
    [DataMember(Name = "Single")]
    public bool? mIsSingle { get; set; }

    [System.Runtime.Serialization.OnDeserialized]
    void OnDeserialized(System.Runtime.Serialization.StreamingContext c)
    {
        mAge = (mAge == null ? 18 : mAge); // 18 is the default value
    }
}
18
BuzBuza

[OnDeserialized] を使用できます

OnDeserializedAttribute 逆シリアル化された後、グラフが返される前に、逆シリアル化されたオブジェクトの値を修正する必要がある場合を使用します。

[DataContract]
 public class Person 
  {
    public Person ()
    {
    }
    [DataMember(Name = "Name")]
    public string mName { get; set; }
    [DataMember(Name = "Age")]
    public int mAge { get; set; }
    [DataMember(Name = "Single")]
    public bool mIsSingle { get; set; }



    [System.Runtime.Serialization.OnDeserialized]
    void OnDeserialized(System.Runtime.Serialization.StreamingContext c)
    {
      mAge = (mAge == 0) ?18:mAge;
    }
  }
}

編集:あなたのコメントから

Boolまたはintの場合、 nullableboolおよびnullableint を使用できるため、これらのage属性とSingle属性がxmlファイルにない場合は、それらもnullになります。

これが私が準備した簡単なサンプルです

using System.Runtime.Serialization;
using System.ServiceModel;
using MySpace;
using System.ServiceModel.Channels;
using System;
namespace MySpace
{

 [DataContract]
 public class Person 
  {
    public Person ()
    {
    }
    [DataMember(Name = "Name")]
    public string mName { get; set; }
    [DataMember(Name = "Age")]
    public int? mAge { get; set; }
    [DataMember(Name = "Single")]
    public bool? mIsSingle { get; set; }



    [System.Runtime.Serialization.OnDeserialized]
    void OnDeserialized(System.Runtime.Serialization.StreamingContext c)
    {
      mAge =  (mAge == null ? 18 : mAge);
    }
  }
}
[ServiceContract]
public interface IService
{
  [OperationContract]
  Person Method(Person dd);
}

public class Service : IService
{
  public Person Method(Person dd)
  {
    return dd;
  }
}

class Program
{
  static void Main(string[] args)
  {
    string Url = "http://localhost:8000/";
    Binding binding = new BasicHttpBinding();
    ServiceHost Host = new ServiceHost(typeof(Service));
    Host.AddServiceEndpoint(typeof(IService), binding, Url);
    Host.Open();
    ChannelFactory<IService> fac = new ChannelFactory<IService>(binding);
    fac.Open();
    IService proxy = fac.CreateChannel(new EndpointAddress(Url));
    Person d = new Person();
    d.mName = "BuzBuza";

    Console.WriteLine("Data before calling service " + (d.mAge == null ? " null " : d.mAge.Value.ToString()));
    Console.WriteLine("Data before calling service " + (d.mIsSingle == null ? "null" : d.mIsSingle.Value.ToString()));
    d = proxy.Method(d);
    fac.Close();
    Host.Close();
    Console.WriteLine("Data after calling service " + (d.mAge == null ? " null " : d.mAge.Value.ToString()));
    Console.WriteLine("Data after calling service " + (d.mIsSingle == null ? "null" : d.mIsSingle.Value.ToString()));

    Console.ReadLine();
  }
}
21
Surjit Samra

使用 [OnDeserializing()]

逆シリアル化の前に値を設定します。したがって、チェックは必要ありませんが、これはうまくいかない可能性があります-mAgeが0にシリアル化された場合はどうなりますか?

4
David

これはうまくいくはずです。

[DataContract]
 public class Person 
  {
    public Person ()
    {
    }
    [DataMember(Name = "Name")]
    public string mName { get; set; }
    [DataMember(Name = "Age")]
    public int mAge = 18;
    [DataMember(Name = "Single")]
    public bool mIsSingle { get; set; }
  };

this ページをご覧ください。

1
DarthVader