2012-10-26 84 views
2

我想实现一些非标准的序列化格式。如何在不调用构造函数的情况下创建对象?

当我做反序列化时,我需要在不调用构造函数的情况下创建对象的实例。

有一个在.NET框架
System.Runtime.Serialization.FormatterServices.GetUninitializedObject(Type type)但没有FormatterServices类在Windows新城框架。

有没有任何机构知道如何实例化对象,而无需在Windows Metro Framework中调用构造函数?

+0

**你不能。**不清楚你认为你需要初始化你的对象的原因 –

+0

@Ramhound,原因是我不知道如果没有默认的构造函数调用哪个构造函数。我想'System.Runtime.Serialization.Json.DataContractJsonSerializer'以同样的方式工作,因为当它反序列化对象时,它不会调用任何构造函数。 –

+0

Iirc,位于.netcore DataContractSerializer(和朋友)* do *运行无参数构造函数。虽然我可能是错的。 –

回答

2

据我所知:你不能。你也不能调用私有的/受保护的/内部的构造函数:.netcore限制了反射(像Silverlight模型,但是增加了GetTypeInfo()的痛苦)。

我建议的唯一选择是为用户提供的工厂方法提供单独的支持,该方法执行相应的事情,或者类似地传递工厂接口的能力。这将构造从序列化引擎中分离出来,并将其放回到了解特定类型的代码的控制之中。

0

我可能是错的,但是当你实例化一个对象时,你至少必须运行一个构造函数。即使没有声明构造函数,也会调用默认的空构造函数。 Instanciation使课堂成为一个对象。

对我而言,你的问题没有答案。

也许你可以在运行时根据需要构建一个默认的空构造函数。 Take a look here

+0

OP是正确的:在.net中你确实可以创建一个实例而不执行任何构造函数。这是非典型的,通常只用于库代码,如序列化引擎,RPC /代理工具和数据库ORM工具。真正的问题是:“常规.net中存在的此功能:它是否存在于.netcore中?”。另外,不能通过反射将构造函数添加到现有类型,并且在.netcore中的所有**都不存在reflection-emit。 –

相关问题