如果将DataMember属性添加到任何字段或属性(包括私有属性),它们仍将被序列化.Microsoft 在其文档中明确指出:
"您可以将DataMemberAttribute应用于私有字段或属性.请注意,成员返回的数据(即使它是私有的)将被序列化和反序列化,因此可以被恶意用户或进程查看或拦截."
例如:
public class MyClass
{
[DataMember(Name = "pushed_at")]
private string JsonDate { get; set; } //PRIVATE!
[IgnoreDataMember]
public DateTime PushedAt
{
get { return JsonDate; }
}
}
var serializer = new DataContractJsonSerializer(typeof(List<MyClass>));
var streamTask = client.GetStreamAsync("https://api.mysite.com/hit");
var classes = serializer.ReadObject(await streamTask) as List<MyClass>;
foreach (var myClass in classes)
{
Console.WriteLine(myClass.JsonDate); //Error because private
Console.WriteLine(myClass.PushedAt); //Ok and shows serialized data
}
Run Code Online (Sandbox Code Playgroud)
为什么这有意义?自封装原理不是比序列化更基础吗?该DataMember属性是否真的可以访问课堂外的私人财产,还是我遗漏了一些东西?
如果你JsonDate公之于众,并给它一个private二传手,那就会发生同样的事情.