2011-06-21 25 views
2

我有一個類,我正在使用序列化和反序列化ASP.NET應用程序中的業務對象。DataContractJsonSerializer的靜態實例 - 好的還是壞的設計?

類包含這個靜態變量:

private static DataContractJsonSerializer m_serializer = new DataContractJsonSerializer(typeof(MyBusinessObject)); 

...並在類兩個靜態方法:

public static string SerializeJson(MyBusinessObject bo); 

public static MyBusinessObject DeserializeJson(string json); 

在這些方法中,我使用靜態DataContractJsonSerializer對象(m_serializer)至執行序列化和反序列化。這樣,我不需要爲每個調用實例化一個DataContractJsonSerializer實例。

以這種方式使用靜態變量是否正確?

如果我在序列化/反序列化代碼上得到很多點擊,我會遇到任何問題嗎?

它會從每秒獲得100個併發點擊的網站調用。

回答

2

亞歷克斯提到的,你可以運行成問題 - 類的文檔指出它不是線程安全的(至少不是用來讀/寫對象的方法)。通過快速查看反射器,看起來序列化實際上可以工作(假設您不是在同一時間在不同線程中序列化同一個對象,這是一個全新的蠕蟲罐),但由於它是內部實現細節,有可能在該框架的新版本中,該類有一些變化(即優化),並且不再是真實的。

你可以考慮的一個選項是有一個池可以重複使用的序列化器。您的代碼將從池中取出一個序列化程序,將其用於序列化/反序列化,然後將其返回到池中。通過這種方式,您可以重用實例,但無需在多個線程中使用線程不安全類的風險。

最後,你是否證實了序列化器的創建確實是一個問題(即通過分析)?在您的場景中,可能會花費的時間可以忽略不計,並且使用某種重複使用會給您的代碼添加不必要的複雜性。

+1

在有限的測試中,無論我使用靜態變量還是每次調用初始化,性能似乎大致相當。 – frankadelic

+0

在這種情況下,不要擔心優化代碼 - 以便於維護的方式編寫代碼。正如Knuth大師所說,「不成熟的優化是萬惡之源」。 – carlosfigueira

相關問題