我想知道为什么不需要构造函数将 json 字符串反序列化为 .Net/C# 类对象实例。我很惊讶构造函数根本没有被调用并将其删除,并且反序列化器仍然从 json 字符串创建了一个对象实例。这是正常的吗?
(我使用ServiceStack的json序列化器)
我想知道为什么不需要构造函数将 json 字符串反序列化为 .Net/C# 类对象实例。我很惊讶构造函数根本没有被调用并将其删除,并且反序列化器仍然从 json 字符串创建了一个对象实例。这是正常的吗?
(我使用ServiceStack的json序列化器)
德国人的回答并不完全正确。可以在不执行任何构造函数的情况下实例化没有默认构造函数的对象。
这是用FormatterServices.GetUninitializedObject
.
如果 ServiceStack 找不到默认构造函数,则使用此方法,因此它可以反序列化没有默认构造函数的对象。
如果未指定构造函数,则编译器会创建默认(无参数)构造函数。当且仅当没有构造函数存在时,编译器才会这样做。如果您在类中创建任何构造函数,则此编译器行为将不再适用。(尝试使用至少一个参数创建一个构造函数,看看会发生什么)
反序列化将涉及两个步骤 - 使用默认(无参数)构造函数创建空对象,然后设置所有值。如果您的类没有默认(无参数)构造函数 - 由您自己显式创建或由编译器创建 - 反序列化将失败。
反序列化从不使用参数化构造函数,因为它不可能猜测要使用的正确构造函数。示例:反序列化无法区分Constructor(String parameter1)
和Constructor(String parameter2)