如何在不调用构造函数的情况下反序列化类?

Igo*_*tin 18 c# json.net deserialization

我在我的WCF数据服务中使用Json.NET.

这是我的课程(简化):

[DataContract]
public class Component
{
    public Component()
    {
        // I'm doing some magic here.
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在调用构造函数的情况下反序列化该类JsonConvert.DeserializeObject

对不起,如果不清楚,随时提问.

jga*_*fin 11

始终调用构造函数.我通常有两个构造函数.一个用于序列化(默认构造函数),一个用于所有"常规"代码:

[DataContract]
public class Component
{
    // for JSON.NET
    protected Component()
    {
    }

    public Component(allMandatoryFieldsHere)
    {
        // I'm doing some magic here.
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我还可以确保开发人员指定所需的所有信息.

但是,我并不建议您在传输信息时使用除DTO之外的任何东西,因为否则可能会绕过对象的封装(任何人都可以使用任何值初始化任何字段).好.如果你使用任何东西,但贫血模型.

使用FormatterServices.GetSafeUninitializedObject是恕我直言,因此一个丑陋的解决办法,因为没有人能告诉你在unintialized方式创建的所有对象.构造函数初始化是有原因的.最好的是,类可以通过提供我建议的"序列化"构造函数来告诉可以不调用真正的构造函数.


Jam*_*ing 7

  1. 您可以创建一个继承自CustomCreationConverter 并用于FormatterServices.GetSafeUninitializedObject创建对象的类.它会跳过调用构造函数.

    有关CustomCreationConverter的更多信息,请点击此处.

  2. 放置 [JsonObject(MemberSerialization.Fields)]在类上将FormatterServices.GetSafeUninitializedObject默认使用Json.NET (尽管Fields模式也将序列化公共/私有字段,而不是您可能不需要的公共属性).

  3. 移动您不希望在默认构造函数之外运行的逻辑.