数据成员的默认值,如何确定是否确实发送了某些内容? [英] Data member default values, how to figure out whether something was really sent?

查看:80
本文介绍了数据成员的默认值,如何确定是否确实发送了某些内容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



所以我的问题是:是否可以在运行时找出默认值是否表示我没有发送任何东西。



这是之所以至关重要,是因为我们不能使用默认值来更新和覆盖数据库中的现有数据,只是因为外部系统这次没有发送特定元素(数据损坏)。



<微软的简短回答是取决于接收端点来适当地解释缺失的元素。



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



请问有人可以解释一下



谢谢

解决方案

如果您将数据成员定义为属性,您可以使用是否调用设置器来确定是否发送了一些值。下面的代码显示了一个数据合约,该合约知道它是否反序列化其字段。

 公共类Post_51ca1ead_2f0a_4912_a451_374daab0101b 
{
[DataContract(Name = Person,Namespace =)]
公共类Person
{
字符串名称;
int年龄;
bool nameWasSent;
bool ageWasSent;

[DataMember]
公共字符串名称
{
get
{
return this.name;
}

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

[DataMember]
public int Age
{
get
{
返回此值。年龄;
}

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

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

公共替代字符串ToString()
{
返回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 =新的MemoryStream(Encoding.UTF8.GetBytes(noAge));
对象p = dcs.ReadObject(ms);
Console.WriteLine( No age:{0},p);

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


By default, WCF deserializes missing elements into default values like null, 0 or false. The problem with this approach is that if it's a basic type like number 0 I'm not sure whether it means the real value sent by an external system or a default value generated by WCF.

So my question is: Is it possible to find out at run-time whether the default value means "I didn't send anything".

This is crucial because we can't update and overwrite existing data in the database with the default values just because the external system didn't send a particular element this time (data corruption).

Microsoft's short answer is "It is up to the receiving endpoint to appropriately interpret a missing element."

Data member default values http://msdn.microsoft.com/en-us/library/aa347792.aspx

Can somebody please clarify what's that supposed to mean?

Thanks

解决方案

If you define your data members as properties, you can use whether the setter was called or not to decide whether some value was sent. The code below shows one data contract which knows whether it deserialized its fields.

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

这篇关于数据成员的默认值,如何确定是否确实发送了某些内容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆