2010-06-17 5 views
13

मैं निम्न विधि के साथ एक RPC सेवा है:gwt - आरपीसी कॉल में सूची <Serializable> का उपयोग करना?

public List<Serializable> myMethod(TransactionCall call) {...} 

लेकिन मैं एक चेतावनी जब इस विधि का विश्लेषण किया जाता हो, और उसके बाद RPC कॉल विफल रहता है

Analyzing 'my.project.package.myService' for serializable types 
Analyzing methods: 
public abstract java.util.List<java.io.Serializable> myMethod(my.project.package.TransactionCall call) 
Return type: java.util.List<java.io.Serializable> 
[...] 
java.io.Serializable 
Verifying instantiability 
(!) Checking all subtypes of Object wich qualify for serialization 

ऐसा लगता है कि मैं अपनी सूची के लिए Serializable का उपयोग नहीं कर सकता ... मैं इसके बजाय अपने स्वयं के इंटरफेस का उपयोग कर सकता हूं (AsyncDataInterface की तरह कुछ, जो Serializ लागू करता है सक्षम इंटरफ़ेस) लेकिन तथ्य यह है कि मेरी विधि एक सूची कस्टम ऑब्जेक्ट्स और मूल ऑब्जेक्ट्स (जैसे स्ट्रिंग्स, int ....) लौटाएगी।

तो मेरी प्रश्न हैं:

  • यह एक standart व्यवहार है? (मुझे पता नहीं लगा सकता कि मैं इस मामले में इस इंटरफ़ेस का उपयोग क्यों नहीं कर सकता)
  • क्या किसी के पास ऐसी स्थिति के लिए कोई समाधान है?

उत्तर

27

आरपीसी कॉल में ऑब्जेक्ट पास करते समय आरपीसी इंटरफेस में कंक्रीट पैरामीटर प्रकार घोषित करने के लिए यह एक अच्छा अभ्यास है। यदि किसी कारण से आप RPC इंटरफ़ेस में कंक्रीट क्लास का उपयोग नहीं कर सकते हैं तो यथासंभव सटीक होने का प्रयास करें।

ऐसा इसलिए है क्योंकि जावास्क्रिप्ट उत्सर्जित करते समय जीडब्ल्यूटी कंपाइलर को संकलन इकाई में सूची के सभी संभावित रूपों को ध्यान में रखना होगा। इसमें वर्ग पथ में सूची और सीरियलज़ेबल इंटरफेस को विस्तारित करने वाली सभी कक्षाएं शामिल हैं। क्रमपरिवर्तन बहुत बड़ा हो सकता है, जो आपके संकलन समय के साथ-साथ एप्लिकेशन डाउनलोड आकार को भी प्रभावित करेगा।

तो सबसे अच्छा तरीका के रूप में

public ArrayList<YourType> myMethod(TransactionCall call) {...} 

बजाय

public List<Serializable> myMethod(TransactionCall call) {...} 

इस तरह संकलक केवल ArrayList और YourType एक्सटेंशन के लिए संकलन इकाइयों उत्पन्न करने के लिए है अपने इंटरफेस को परिभाषित करने के लिए है। लाभ तेजी से बार और छोटे संकलित जावास्क्रिप्ट फ़ाइलें, आपके आवेदन की इसलिए तेज़ डाउनलोड संकलन में है।

मामले आप अपने RPC कॉल में असंबंधित वस्तुओं की एक विस्तृत श्रृंखला वापस लौटाना होगा, एक आवरण वर्ग बनाने का प्रयास करें और लिपटे वापसी मान के साथ वापसी आवरण वर्ग की वस्तु। RPC विधि परिभाषा आवरण वर्ग का प्रयोग करें। वस्तु या Serializable के रूप में लिपटे क्षेत्र घोषित करने के लिए इच्छा को दबाना, आप सभी क्रमबद्धता लाभ आप एक आवरण का उपयोग करके प्राप्त की नकारना होगा। इसके बजाय आप एक आवरण इंटरफेस और प्रत्येक ठोस प्रकार आप अपने RPC कॉल के माध्यम से वापस आने की इच्छा के लिए आवरण कार्यान्वयन का एक छोटा सा सेट को परिभाषित कर सकते हैं।

1

आप यह जांचना चाहेंगे कि धारावाहिक नीति फ़ाइल समस्या का स्रोत नहीं है।

Quote from GWT documentation:

हालांकि, वहाँ एक शर्त नए GWT RPC प्रणाली में java.io.Serializable के लिए समर्थन सक्षम करने के लिए है।

आरपीसी अब जीडब्ल्यूटी संकलन के दौरान एक क्रमबद्धता नीति फ़ाइल उत्पन्न करता है। क्रमबद्धता नीति फ़ाइल में अनुमत प्रकारों की एक श्वेतसूची शामिल है जिसे क्रमबद्ध किया जा सकता है। इसका नाम एक मजबूत हैश नाम है जिसके बाद .gwt.rpc है। Java.io.Serializable के लिए समर्थन को सक्षम करने के लिए, तार पर आपके आवेदन भेजे जाने वाले प्रकारों को क्रमबद्धता नीति श्वेतसूची में शामिल किया जाना चाहिए। साथ ही, serialization नीति फ़ाइल को आपके वेब सर्वर पर सार्वजनिक संसाधन के रूप में तैनात किया जाना चाहिए, जो RemoteContext.getResource() के माध्यम से RemoteServiceServlet से सुलभ है। यदि इसे ठीक से तैनात नहीं किया गया है, तो आरपीसी 1.3.3 संगतता मोड में चलाएगा और java.io.Serializable को लागू करने वाले प्रकारों को क्रमबद्ध करने से इंकार कर देगा।

0

मुझे सूची < सीरियलज़ेबल> वापसी मूल्य के रूप में परिभाषित करने का बिंदु नहीं दिख रहा है। प्रकार Serializable सेवा एपीआई घोषणा में कोई अतिरिक्त जानकारी प्रदान करता है। जीडब्ल्यूटी वैसे भी रनटाइम पर क्रमबद्धता जांच करेगा।

आपके मामले में, जहां सूची तत्वों के ऑब्जेक्ट के अलावा कोई सामान्य पूर्वज नहीं है, मैं सूची <?> का उपयोग करूंगा।