为什么 CosmosDB 只保存公共成员?

Gyö*_*yás 2 c# azure-cosmosdb

我有包含一些受保护和私有成员的测试类:

    public class Doc_PrivateValues : Document
    {
        public int PublicIntProperty { get; set; }
        public int PublicIntField;

        protected int ProtectedIntProperty { get; set; }
        protected int ProtectedIntField;

        private int PrivateIntProperty { get; set; }
        private int PrivateIntField;

        public SimpleDocument PublicDocument;
        protected SimpleDocument ProtectedDocument;
        private SimpleDocument PrivateDocument;

        public SimpleStruct PublicStruct;
        protected SimpleStruct ProtectedStruct;
        private SimpleStruct PrivateStruct;
    }
Run Code Online (Sandbox Code Playgroud)

我以非常简单的方式将此文档保存到 CosmosDB 中:

        Microsoft.Azure.Documents.Document result = CosmosClient.CreateDocumentAsync( CosmosCollection.SelfLink, document ).Result.Resource;
        document.id = result.Id;
Run Code Online (Sandbox Code Playgroud)

以及数据库中的结果:

{
    "PublicIntField": 2,
    "PublicDocument": {
        "StrVal": "seven",
        "IntVal": 7,
        "id": null
    },
    "PublicStruct": {
        "StrVal": "ten",
        "IntVal": 10
    },
    "PublicIntProperty": 1,
    "id": "58f18ccf-9e0c-41a6-85cd-a601f12a120a",
    "_rid": "mPlfANiOud4BAAAAAAAAAA==",
    "_self": "dbs/mPlfAA==/colls/mPlfANiOud4=/docs/mPlfANiOud4BAAAAAAAAAA==/",
    "_etag": "\"00000000-0000-0000-8b2a-d853688c01d4\"",
    "_attachments": "attachments/",
    "_ts": 1543856923
}
Run Code Online (Sandbox Code Playgroud)

文档仅包含公共成员。我怎样才能保存非公开成员?

谢谢!

Nic*_*sas 5

JSON.NET 无权访问非公共属性,这就是它无法处理它们的原因。它根本看不到它们。

您可以做的是编写自己的ContractResolver,使用反射来获取非公共属性。

然后,你可以简单地提供JsonSerializerSettings在任一DocumentClient或操作水平。

此处描述了这样做的方法:JSON.Net:强制序列化所有私有字段和子类中的所有字段