あなたがプロパティとしてデータメンバーを定義する場合は、セッターがいくつかの値が送られたかどうかを決定するために呼ばれたか否かを使用することができます。以下のコードは、フィールドを直列化解除したかどうかを知る1つのデータコントラクトを示しています。
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);
}
}
あなたはOnDeserializedAttributeを使用することはできますかOnDeserializingAttribute http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute.aspxまたはhttp://msdn.microsoft.com/en- us/library/system.runtime.serialization.ondeserializingattribute.aspx –
null可能なデータメンバーの使用についてはどうですか? http://stackoverflow.com/questions/2426892/wcf-datacontract-does-it-support-nullable-data-member基本的には、データベースにフィールドを保存する前に、ある種のヌルチェックが必要です。 WCFは、欠落している要素をヌル値にデシリアライズできるかどうかを判定します。 – user405723