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