2011-12-15 50 views
3

我已閱讀關於序列化理論部分,它表示當需要保持對象狀態時它是必需的。 我寫了一個Web服務應用程序,它會在不同的JVM哪些變量或對象應該與transient關鍵字相關聯?

我在提高我的Web服務,所以我決定用我的一些變量transient關鍵字我Webservice類中的性能的進程中運行

我有與之相關的,哪些對象需要序列一些問題,什麼不應該

1.首先開始與我的記錄儀,我會使用關鍵字transient 例如:

private transient static final Logger logger = Logger.getLogger(Tata.class); 

2.但是類中的實例變量呢?我們是否需要爲他們使用瞬態? 例如:

String strategyData = null; 
String errorText = null; 
Properties prop = null; 

請分享您的輸入。

+3

[短暫的靜態最終](http://www.xyzws.com/Javafaq/can-transient-variables-be-declared -as-final-or-static/0)沒有意義。 – 2011-12-15 11:39:57

回答

0

序列化用於在需要保持對象狀態的地方。或者需要在不同的機器(或虛擬機,如果您在一臺機器上使用多個虛擬機)之間傳輸對象狀態等。

例如,如果您甚至在重新啓動系統後仍然看到對象的狀態,則可以使用序列化。

此外,您可能不需要保存對象中的所有狀態。爲此,您可以將該變量聲明爲transient。

如果您只需要strategyData即可保留,則可以將其他兩個變量聲明爲瞬態。

注意。如果你需要序列化一個對象。所有在內部引用的對象也必須是可序列化的,否則您需要將它們聲明爲transient。

+0

謝謝,如果實例變量是序列化對象的一部分,我們可以將這些實例變量聲明爲瞬態嗎? – Pawan 2011-12-15 11:46:42

0

您應該將所有不能或不應該與其他對象字段一起被序列化的字段標記爲臨時字段。

不可序列化的字段不能被序列化,因此如果屬於可序列化的類,則必須將其標記爲瞬態。該示例是包含多個字段的類,其中一個是Thread。顯然線程不能被序列化。因此,將其標記爲暫時的,並實現在序列化後恢復對象時創建新線程的機制。

其他例子是當字段可以但不應該被序列化。例如進程ID。假設你的程序擁有其他進程的進程ID。進程ID本身是int,所以沒有問題將其串行化。但在幾分鐘內其他環境或相同環境中沒有任何意義(因爲該過程可能已不存在)。

0

web服務類本身不被序列化。序列化由Web服務方法返回的數據對象及其參數。它們應該包含對象的接收者所需的信息。

如果收件人不需要某些信息,並且如果該對象不會導致異常,並將此信息設置爲null,則可以將其標記爲暫時。但是,如果收件人不需要它,它可能不應該成爲第一個對象的一部分。

如果你在DTO內部使用記錄器,那麼這個記錄器絕對不應該被序列化。但是,確保在每次使用記錄器時都檢查記錄器是否爲空。

0

你是指'在不同的JVM上運行'是什麼意思?

如果它可以在幾個JVM(例如分佈式服務器)上同時運行,那麼表示對象狀態的變量不能是瞬態的,例如

否則,其他服務器實例會使您的服務處於不一致的狀態。

相關問題