2012-08-02 14 views
8

मैं क्लाइंट-सर्वर आर्किटेक्चर में वायर डेटा-प्रारूप के रूप में प्रोटोकॉल बफर का उपयोग कर रहा हूं। डोमेन ऑब्जेक्ट्स (जावा बीन्स) जीवन चक्र के माध्यम से चलेगा।प्रोटोकॉल बफर और ओओ डिज़ाइन

  1. ग्राहक के पक्ष व्यापार तर्क में इस्तेमाल किया
  2. प्रारूप Protobuf को
  3. सर्वर
  4. डोमेन वस्तु
  5. सर्वर साइड व्यापार तर्क में प्रयुक्त करने के लिए वापस परिवर्तित करने के लिए संचारित परिवर्तित

"Protocol Buffers and O-O Design" प्रोटोबफ दस्तावेज में सेक्शन उचित डोमेन मॉडल के अंदर जेनरेट कक्षा को लपेटने की सिफारिश करता है।

मैं सबसे अच्छा ऐप खोजना चाहता हूं।

उदा। मेरे पास एक साधारण प्रोटो परिभाषा है।

package customer; 

option java_package = "com.example"; 
option java_outer_classname = "CustomerProtos"; 

message Customer { 
    required string name = 1; 
    optional string address = 2; 
} 

इस प्रकार डोमेन मॉडल परिभाषित किया गया है। जैसा कि आप देख सकते हैं, डेटा पूरी तरह से प्रोटो बिल्डर ऑब्जेक्ट में संग्रहीत है।

package com.example; 

public class CustomerModel 
{ 
    private CustomerProtos.Customer.Builder builder = CustomerProtos.Customer.newBuilder(); 

    public String getName() 
    { 
     return builder.getName(); 
    } 

    public void setName(String name) 
    { 
     builder.setName(name); 
    } 

    public String getAddress() 
    { 
     return builder.getAddress(); 
    } 

    public void setAddress(String address) 
    { 
     builder.setAddress(address); 
    } 

    public byte[] serialize() 
    { 
     return builder.build().toByteArray(); 
    } 

} 

क्या यह एक अच्छा अभ्यास है? क्योंकि इन वस्तुओं का उपयोग जीवन चक्र के सभी चरणों में किया जाता है, लेकिन हमें केवल क्लाइंट-सर्वर ट्रांसमिशन चरण में प्रोटोकॉलबफ प्रारूप की आवश्यकता होती है।

प्रोटो बिल्डर क्लास गेटर/सेटर विधियों तक विशेष रूप से प्रोटो परिभाषा जटिल और घोंसला होने पर कोई प्रदर्शन समस्या है?

उत्तर

5

मुझे प्रोटोकॉल बफर के साथ कोई अनुभव नहीं है, लेकिन मैं एक विशिष्ट धारावाहिक/स्थानांतरण ढांचे के अनुरूप आपके डोमेन ऑब्जेक्ट्स को लागू करने की अनुशंसा करता हूं। भविष्य में आपको पछतावा हो सकता है।

सॉफ़्टवेयर एप्लिकेशन की डोमेन ऑब्जेक्ट्स और तर्क विशिष्ट कार्यान्वयन समस्याओं (आपके केस क्रमिकरण/स्थानांतरण में) से जितना संभव हो उतना स्वतंत्र होना चाहिए, क्योंकि आप चाहते हैं कि आपका डोमेन समझने में आसान हो और भविष्य में पुन: प्रयोज्य/रखरखाव योग्य हो ।

आप अपने डोमेन क्रमबद्धता/हस्तांतरण की स्वतंत्र वस्तुओं को परिभाषित करना चाहते हैं, तो आप दो विकल्प हैं:

  1. पहले क्रमबद्धता/स्थानांतरण, आप बफ़र्स विशिष्ट वस्तुओं प्रोटोकॉल के लिए जानकारी प्रतिलिपि बनाकर अपने सर्वर को भेज । वहां आप को जानकारी को अपने डोमेन ऑब्जेक्ट्स पर वापस कॉपी करना होगा।
  2. सर्वर पर सीधे अपने डोमेन ऑब्जेक्ट्स को सीधे स्थानांतरित करने के लिए Kryo या ProtoStuff जैसे गैर-प्रोटोकॉल क्रमबद्धता लाइब्रेरी का उपयोग करें।

विकल्प 1 के नुकसान यह है कि आपका डोमेन दो बार परिभाषित किया गया है (जो संशोधनों के संबंध में अवांछनीय है) और जानकारी की प्रतिलिपि (जो त्रुटि-प्रवण और गैर रखरखाव कोड उत्पन्न करती है)।

विकल्प 2 के नुकसान यह है कि आप schema evolution खो देते हैं (हालांकि प्रोटोस्टफ स्पष्ट रूप से supports it) और पूर्ण (संभावित रूप से बड़ा) ऑब्जेक्ट ग्राफ़ क्रमबद्ध और स्थानांतरित किया जाता है।यद्यपि आप क्रमिकरण/स्थानांतरण से पहले ऑब्जेक्ट ग्राफ़ (मैन्युअल रूप से या JGT के साथ) को छीन सकते हैं।

2

हमने Google प्रोटोबफ संदेशों में आपके डोमेन मॉडल ऑब्जेक्ट्स के परिवर्तन की समस्या को हल करने के लिए protobuf-converter बनाया है और इसके विपरीत।

इसका उपयोग कैसे करें:

डोमेन मॉडल वर्गों है कि Protobuf संदेशों में तब्दील किया जा करने के लिए शर्तों को पूरा करना होगा:

  • कक्षा @ProtoClass द्वारा चिह्नित किया जाना annotaion कि शामिल है संबंधित प्रोटोबफ संदेश वर्ग पर संदर्भ।
  • कक्षा क्षेत्रों को @ProtoField एनोटेशन द्वारा चिह्नित किया जाना है। इन क्षेत्रों में गेटर्स और सेटर्स होना चाहिए।

उदाहरण के लिए:

User userDomain = new User(); 
... 
ProtobufUser userProto = Converter.create().toProtobuf(ProtobufUser.class, userDomain); 

पिछड़े रूपांतरण के लिए कोड::

@ProtoClass(ProtobufUser.class) 
public class User { 

    @ProtoField 
    private String name; 
    @ProtoField 
    private String password; 

    // getters and setters for 'name' and 'password' fields 
    ... 
} 

संबंधित Protobuf संदेश में रूपांतरण उपयोगकर्ता उदाहरण के लिए कोड

User userDomain = Converter.create().toDomain(User.class, userProto); 

वस्तुओं की सूची का रूपांतरण है एकल ऑब्जेक्ट रूपांतरण के समान।

संबंधित मुद्दे