C# RavenDB:如何防止$type保存到动态类型属性?

C# RavenDB:如何防止$type保存到动态类型属性?,c#,dynamic,ravendb,ravendb4,C#,Dynamic,Ravendb,Ravendb4,在保存动态类型值时,是否有方法防止添加$type属性 当我保存此文件时: new Activity { Name = "FormFieldDeleted", Body = new { MyDeletedFormField(), MyCompleteForm() } } 我明白了 <>f__AnonymousType1`2[[MyProject.Domains.Forms.Models.FormField, MyProject

在保存动态类型值时,是否有方法防止添加
$type
属性

当我保存此文件时:

new Activity {
    Name = "FormFieldDeleted",
    Body =  new {
        MyDeletedFormField(),
        MyCompleteForm()
    }
}
我明白了

<>f__AnonymousType1`2[[MyProject.Domains.Forms.Models.FormField, MyProject.Domains.Forms],[MyProject.Domains.Forms.Entities.FormRegistration, MyProject.Domains.Forms]], MyProject.Api.Forms
是的,有办法。
您可以使用以下代码自定义序列化的工作方式:

store.Conventions.CustomizeJsonSerializer=serializer=>
{
serializer.TypeNameHandling=Newtonsoft.Json.TypeNameHandling.None;
};
作为一个例子,请看下面的代码:


如果您在dotnetfiddle上执行代码,您可以在这里看到结果:

对于RavenDB 5及更高版本,它有一点变化

var store = DocumentStore
{
    Urls = new[] { "your-endpoint" },
    Conventions = new DocumentConventions
    {
        Serialization = new NewtonsoftJsonSerializationConventions
        {
            CustomizeJsonSerializer = serializer =>
            {
                serializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.None;
            }
        }
    }
}.Initialize();

有关更多信息,请参阅。

啊,太好了!谢谢你的解决方案。您知道这是否有任何缺点吗?据我所知,通常使用“无”-其他设置是外部接收数据的安全代码气味。请注意,在RavenDB 4.x中,服务器端根本不使用$type,因为在服务器上,json是用自定义json序列化程序反序列化的,而不是Newtonsoft.json(请参阅)谢谢您的反馈,非常感谢!保存类型在继承时很有用,否则Newtonsoft将无法自动反序列化类型。这是一个比文档提供的更好的示例:)
var store = DocumentStore
{
    Urls = new[] { "your-endpoint" },
    Conventions = new DocumentConventions
    {
        Serialization = new NewtonsoftJsonSerializationConventions
        {
            CustomizeJsonSerializer = serializer =>
            {
                serializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.None;
            }
        }
    }
}.Initialize();