DataContract,默认DataMember值

有没有办法在反序列化期间选择不在xml文件中的属性的默认值?
如果xml文件中没有mAge属性,我想使用默认值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 } } 

你可以使用[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,您可以使用可空的bool和nullable int,因此如果xml文件中缺少这些age和Single属性,那么它们也将为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 fac = new ChannelFactory(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(); } } 

使用[OnDeserializing()]

并在反序列化之前设置值。 所以没有必要检查,这可能会出错 – 如果mAge序列化为0怎么办?

这应该工作。

 [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; } }; 

看看这个页面。