为什么C#DataMember属性允许私有字段和属性的序列化?

kil*_*out 2 c# oop

如果将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二传手,那就会发生同样的事情.

Jac*_*row 5

自封装原理不是比序列化更基础吗?

使用反射进行序列化,以便我们可以更改您的问题:

自我封装的原则不是比反思更基本吗?

所以是答案