क्या मॉडल बीन (पुन: उपयोग) में स्थिर क्षेत्र के रूप में Gson उदाहरण का उपयोग करना ठीक है?


138

यहां मैंने जो मॉडल लागू किया है:

public class LoginSession {
    private static final Gson gson = new Gson();

    private String id;
    private String name;
    private long timestamp;

    public LoginSession(String id, String name) {
        this.id = id;
        this.name = name;
        this.timestamp = System.currentTimeMillis();
    }

    public String toJson() {
        return gson.toJson(this);
    }

    public static LoginSession fromJson(String json) {
        checkArgument(!isNullOrEmpty(json));
        return gson.fromJson(json, LoginSession.class);
    }
}

मुझे लगा कि हर LoginSession उदाहरण के लिए नया Gson उदाहरण बनाना बेकार है।

लेकिन जो मैं चिंतित हूं वह थ्रेड-सेफ्टी मुद्दे हैं। लगभग 1000+ उदाहरण / सेकंड बनाए जाएंगे।

क्या स्थिर क्षेत्र के रूप में Gson उदाहरण का उपयोग करना ठीक है?

किसी भी सलाह / सुधार के लिए धन्यवाद।

जवाबों:


133

यह मुझे ठीक लगता है। जीएसओएन उदाहरण में कुछ भी नहीं है जो इसे एक विशिष्ट उदाहरण से संबंधित बनाता है LoginSession, इसलिए इसे स्थिर होना चाहिए।

GSON इंस्टेंस थ्रेड-सुरक्षित होना चाहिए , और इसके बारे में एक बग था जो तय हो गया था।


@slott, आप लोग पूल कैसे करते हैं / Gson के उदाहरणों का पुन: उपयोग कैसे करते हैं? क्या आपको हर बार एक बार सीरियल करने की ज़रूरत है? या थ्रेडलोक पूल का उपयोग करें?
दिलुम रणतुंगा

हम Google Volley के साथ GSON का उपयोग करते हैं और जब हम JSON डेटा समवर्ती करते हैं तो हमें यह समस्या दिखाई देती है। मैं जो देख सकता हूं वह इस तथ्य से संबंधित है कि हम डेटाइम मूल्यों को पार्स करने के लिए टाइमस्टैम्प को परिभाषित करते हैं।
slott

1
डेटाटाइम थ्रेड सुरक्षित नहीं है, यही कारण हो सकता है, ऐसा नहीं है कि GSON थ्रेड सुरक्षित नहीं है।
एंड्रियास मैटिसन

20

कोर Gsonक्लास थ्रेड-सेफ है। मुझे सिर्फ थ्रेड-सेफ्टी समस्या का सामना करना पड़ा जो कि GSON के साथ थी। कस्टम का उपयोग करते समय JsonDeserializerऔर पार्सिंग और स्वरूपण के JsonSerializerलिए समस्या हुई Date। जैसा कि यह निकला, थ्रेड-सेफ़्टी का मुद्दा मेरी पद्धति के एक स्थिर SimpleDateFormatउदाहरण का उपयोग करने के साथ था जो थ्रेड-सुरक्षित नहीं है। एक बार जब मैंने स्थैतिक SimpleDateFormatको एक ThreadLocalउदाहरण में लपेट दिया , तो सब कुछ ठीक हो गया।


4
एक बेहतर विकल्प अपाचे कॉमन्स FastDateFormat (कॉमन्स-लैंग का हिस्सा) का उपयोग करना हो सकता है, जो स्पष्ट रूप से थ्रेडसेफ़ है। commons.apache.org/proper/commons-lang/apidocs/org/apache/…
मार्कोउ

धन्यवाद @Zaan महान टिप!
entpnerd

8

टिप्पणियों के अनुसार मौजूदा इकाई परीक्षण वास्तव में बहुत परीक्षण नहीं करता है, थ्रेड सुरक्षा से संबंधित किसी भी चीज़ से सावधान रहें ...

थ्रेड सुरक्षा के लिए एक यूनिट परीक्षण जाँच है:

/**
 * Tests for ensuring Gson thread-safety.
 *
 * @author Inderjeet Singh
 * @author Joel Leitch
 */
public class ConcurrencyTest extends TestCase {
  private Gson gson;
  ...

आपको आश्चर्य हो सकता है कि क्या यह इकाई परीक्षण हर संभव मशीन विन्यास पर हर संभव समस्या खोजने के लिए पर्याप्त है? इस पर कोई टिप्पणी?

डॉक्स में यह वाक्य भी है :

Json संचालन को लागू करते समय Gson उदाहरण किसी भी राज्य को बनाए नहीं रखता है। तो, आप कई Json क्रमांकन और डीरिएलाइज़ेशन संचालन के लिए समान ऑब्जेक्ट का पुन: उपयोग करने के लिए स्वतंत्र हैं।


3
मैंने कहा होगा कि यह इकाई परीक्षण संक्षिप्त मुद्दों का पता लगाने के लिए अपर्याप्त था। सबसे पहले, MyObject एक जटिल वर्ग है जिसमें कोई जटिल संग्रह शामिल नहीं है ताकि सूचियों और मानचित्रों के समवर्ती de / serialization और अन्य जटिल वस्तुओं का परीक्षण न हो। दूसरा, क्रमबद्धता 10 थ्रेड्स में से प्रत्येक के लिए केवल 10 बार पुनरावृत्त होती है, जो अपर्याप्त है। तीसरा, संगामिति दोष वैसे भी परीक्षण के लिए कुख्यात हैं क्योंकि विभिन्न हार्डवेयर कॉन्फ़िगरेशन में अलग-अलग रनटाइम विशेषताएँ होती हैं, इसलिए सभी कॉन्फ़िगरेशन पर चलने की गारंटी देने पर ही कोई भी परीक्षण मान्य होगा।
लॉरेंस डॉल

1
उदाहरण के लिए, यह परीक्षण संभवतः एकल कोर मशीन पर किसी भी संगामिति दोष को नहीं ढूंढेगा, क्योंकि प्रत्येक धागा संभवत: एक एकल समय के भीतर पूरा हो जाएगा और इसलिए थ्रेड लगातार चलेगा, समवर्ती नहीं।
लॉरेंस डोल

3
यह कहना नहीं है कि यह थ्रेडसेफ़ नहीं है, केवल यह कि यह परीक्षण दूरस्थ रूप से गारंटी भी नहीं देता है कि यह है।
लॉरेंस डॉल

1

थोड़ी देर पहले हमारे पास थ्रेड सुरक्षा के मुद्दे थे और हमने Apache कॉमन में FastDateFormat का उपयोग करके इसे हल किया।

बस इसके लिए Gist के लिए एक Gist लिंक बनाया है जिससे लोगों को यह सोचने में मदद मिल सके कि क्या Gson के उदाहरणों का पुन: उपयोग किया जा सकता है या नहीं। उनके पास बसने की जगह नहीं है और सभी संस्करण निजी हैं।

SimpleDateFormat मुद्दे के अलावा तो मैं उन्हें कहीं और राज्य बनाए रखने के लिए नहीं देख रहा हूँ।

जाँच करें यह बाहर। यह मेरा पहली बार है जब इनमें से किसी एक का उत्तर दिया जा रहा है। एक बार के लिए वापस देने के लिए खुश। :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.