gpt4 book ai didi

c# - DataContract,默认DataMember值

转载 作者:可可西里 更新时间:2023-11-01 02:59:20 24 4
gpt4 key购买 nike

有没有办法在反序列化时选择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]

Use the OnDeserializedAttribute when you need to fix values on a deserialized object after it has been deserialized and before the graph is returned.

[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 文件中缺少这些 age 和 Single 属性,那么它们也将为空。

这是我准备的快速示例

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();
}
}

关于c# - DataContract,默认DataMember值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8566204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com