簡體   English   中英

XmlSerializer和Activator.CreateInstance()

[英]XmlSerializer & Activator.CreateInstance()

好的,我們都知道,對於沒有無參數構造函數的類,不能對XmlSerializer使用XmlSerializer,因為反序列化器將創建對象並設置所有屬性。 但是,通過使用Activator.CreateInstance()可以實例化類而無需無參數的構造函數。 例如,我們可以實例化以下類:

public class Foo
{
    public Foo(string bar){}
}

可以通過Activator輕松實例化該類:

Activator.CreateInstance(typeof(Foo),"some string");

不幸的是,'Foo'無法使用XmlSerializer進行序列化,因為它沒有無參數的構造函數。 為什么沒有辦法像這樣使用XmlSerializer:

new XmlSerializer(typeof(Foo)).Deserialize(stream,"some string");

當然,我可以實現自己的序列化程序,該序列化程序將簡單地存儲對象的類型以及所有屬性和字段,然后使用Activator實例化該對象並設置先前存儲的屬性。 問題是:這有意義嗎? 我想肯定有一個很強的理由反對,因為否則將已經實施,對嗎?

XmlSerializer通過C#代碼生成和動態編譯工作; 因為它使用C#編譯器,所以有必要對其生成的代碼進行編譯-注意它必須作為獨立的程序集遵守這些規則(沒有internalprivate訪問權限)。

基本上,它想使用new Foo() ,因為它從字面上發出C#代碼"new Foo()" ,該代碼被饋送到編譯器。

是的,它可能選擇使用其他實例化技術,但是:作者選擇使用new Foo() -這是一個合理的默認值。

其他一些序列化程序選擇使用Activator ,而其他一些序列化程序仍使用偷偷摸摸的IL技術,這些技術可直接訪問非公共方法而無任何間接方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM