2012-10-26 83 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。 –

相關問題