在反序列化过程中,有没有办法选择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
}
}发布于 2011-12-20 04:27:10
您可以使用[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,您可以使用nullable bool and nullable int,因此如果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();
}
}发布于 2015-04-23 04:51:04
使用[OnDeserializing()](https://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializingattribute(v=vs.110%29.aspx)
并且在反序列化之前设置您的值。所以没有必要进行检查,这可能会出错--如果mAge被序列化为0怎么办?
发布于 2011-12-20 03:16:15
这应该是可行的。
[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页面。
https://stackoverflow.com/questions/8566204
复制相似问题