如何在不调用构造函数的情况下创建一个对象?

4

我希望实现一些非标准序列化格式。

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

.NET框架中有System.Runtime.Serialization.FormatterServices.GetUninitializedObject(Type type),但是Windows Metro Framework中没有FormatterServices类。

是否有人知道如何在Windows Metro Framework中实例化对象而无需调用构造函数?


你不能这样做。不清楚你认为需要取消初始化对象的原因。 - Security Hound
@Ramhound,原因是如果没有默认构造函数,我不知道要调用哪个构造函数。我猜System.Runtime.Serialization.Json.DataContractJsonSerializer的工作方式也是一样的,因为当它反序列化对象时,它不会调用任何构造函数。 - Alexander Eroma
据我所知,在 .netcore 中,DataContractSerializer(和相关类)确实会运行一个无参数构造函数。不过,我可能是错的。 - Marc Gravell
@ramhound 这不是“取消初始化”对象,而是创建一个未初始化的对象 - 在序列化中非常常见。 - Marc Gravell
@alexander 纯属好奇,这个格式是什么?它是一些通用的东西吗?还是只适用于你的场景?我问的原因是:我深度参与序列化代码,并且我有针对 .netcore 和其他平台的现有技术/工具。如果其他开发人员觉得有用,我可能能找到一些时间来帮助您创建一个用于此目的的 F/OSS 库(非常感谢从 protobuf-net 源码中窃取大量代码)。如果不行,那么您仍然可能会发现其中某些代码对参考有用。 - Marc Gravell
@MarcGravell,感谢您的回答。我正在开发一个库,其目的是为MIME-DIR类型实现提供简化的API,例如vCardVCalendar。用户只需编写以下代码:[MimeRecordEntry(Name = "PHOTO")] public Photo Photo { get; set; },序列化程序就会将其转换为:PHOTO;ENCODING=b;TYPE=JPEG:1h...N0 - Alexander Eroma
2个回答

2
据我所知,您无法这样做。您也无法调用私有/受保护的/内部构造函数:.netcore已经限制了反射(类似于Silverlight模型,但增加了GetTypeInfo()的痛苦)。
我唯一能建议的选项是为用户提供单独的支持,以提供适当操作的工厂方法,或类似地传递工厂接口的能力。这将构建从序列化引擎中拿走,并将其放回特定类型的代码控制之下。

0
我可能错了,但当你实例化一个对象时,至少要运行一个构造函数。即使没有声明构造函数,也会调用默认的空构造函数。实例化使一个类变成一个对象。
所以对我来说,你的问题没有答案。
如果需要的话,也许你可以在运行时构建一个默认的空构造函数。在这里看一下

楼主是正确的:在常规的.NET中,确实可以创建一个实例而不执行任何构造函数。这是非典型的情况,通常只有库代码(如序列化引擎、RPC/代理工具和数据库ORM工具)才会使用。真正的问题是:“这个在常规的.NET中存在的特性,在.NET Core中是否也存在?”此外,你不能通过反射向现有类型添加构造函数,并且在.NET Core中根本不存在反射发射。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接