gpt4 book ai didi

wcf - 数据成员默认值,如何判断是否真的发送了一些东西?

转载 作者:行者123 更新时间:2023-12-04 06:00:18 27 4
gpt4 key购买 nike

默认情况下,WCF 将缺失的元素反序列化为默认值,如 null、0 或 false。这种方法的问题在于,如果它是像数字 0 这样的基本类型,我不确定它是指外部系统发送的实际值还是 WCF 生成的默认值。

所以我的问题是:是否有可能在运行时找出默认值是否意味着“我没有发送任何东西”。

这很重要,因为我们不能仅仅因为这次外部系统没有发送特定元素(数据损坏)就用默认值更新和覆盖数据库中的现有数据。

微软的简短回答是“由接收端点来适本地解释缺失的元素。”

数据成员默认值
http://msdn.microsoft.com/en-us/library/aa347792.aspx

有人可以澄清一下这是什么意思吗?

谢谢

最佳答案

如果将数据成员定义为属性,则可以使用是否调用 setter 来决定是否发送了某个值。下面的代码显示了一个数据契约,它知道它是否反序列化了其字段。

public class Post_51ca1ead_2f0a_4912_a451_374daab0101b
{
[DataContract(Name = "Person", Namespace = "")]
public class Person
{
string name;
int age;
bool nameWasSent;
bool ageWasSent;

[DataMember]
public string Name
{
get
{
return this.name;
}

set
{
this.nameWasSent = true;
this.name = value;
}
}

[DataMember]
public int Age
{
get
{
return this.age;
}

set
{
this.ageWasSent = true;
this.age = value;
}
}

[OnDeserializing]
void OnDeserializing(StreamingContext ctx)
{
this.ageWasSent = false;
this.nameWasSent = false;
}

public override string ToString()
{
return string.Format("Person[Name={0},Age={1}]",
nameWasSent ? name : "UNSPECIFIED",
ageWasSent ? age.ToString() : "UNSPECIFIED");
}
}

public static void Test()
{
MemoryStream ms = new MemoryStream();
DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
dcs.WriteObject(ms, new Person { Name = "John", Age = 30 });
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));

string noAge = "<Person><Name>John</Name></Person>";
ms = new MemoryStream(Encoding.UTF8.GetBytes(noAge));
object p = dcs.ReadObject(ms);
Console.WriteLine("No age: {0}", p);

string noName = "<Person><Age>45</Age></Person>";
ms = new MemoryStream(Encoding.UTF8.GetBytes(noName));
p = dcs.ReadObject(ms);
Console.WriteLine("No name: {0}", p);
}
}

关于wcf - 数据成员默认值,如何判断是否真的发送了一些东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993507/

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