2011-12-09 19 views
5

का उपयोग कर चक्रीय डेटा संरचनाओं (जैसे निर्देशित ग्राफ) एन्कोडिंग मेरे पास एक ग्राफ डेटा संरचना है जिसे मैं protocol buffers के साथ एन्कोड करना चाहता हूं। ग्राफ शिखर के बीच चक्रीय कनेक्शन हैं। Protobuf में ऐसी संरचनाओं को एन्कोड करने के लिए एक मानक/सामान्य तरीका है? एक दृष्टिकोण जो दिमाग में आता है वह प्रत्येक वर्टेक्स में "आईडी" फ़ील्ड जोड़ना है, और पॉइंटर्स के बजाय उन आईडी का उपयोग करना है। उदा .:प्रोटोकॉल बफर

message Vertex { 
    required int32 id = 1; 
    required string label = 2; 
    repeated int32 outgoing_edges = 3; // values should be id's of other nodes 
} 

message Graph { 
    repeated Vertex vertices = 1; 
} 

तब मैं वर्गों है कि Protobuf-उत्पन्न वर्गों लपेट, और स्वचालित रूप से इन पहचानकर्ता (क्रमबद्धता पर आईडी के लिए और पीछे) अक्रमांकन पर वास्तविक संकेत में बदलने लिख सकते हैं। क्या यह सबसे अच्छा तरीका है? यदि ऐसा है, तो क्या किसी को मौजूदा परियोजनाओं के बारे में पता है जो इस दृष्टिकोण का उपयोग/दस्तावेज करते हैं? यदि नहीं, तो आप किस दृष्टिकोण की सिफारिश करेंगे?

उत्तर

2

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

प्रोटोबफ-नेट (सी #/.नेट) में एक साइड नोट के रूप में, मैंने इसके लिए समर्थन जोड़ा है जो चुपचाप अमूर्तता की एक परत जोड़ता है। असल में, निम्नलिखित कार्य:

[ProtoContract] 
class Vertex { 
    ... 
    [ProtoMember(3, AsReference = true)] 
    public List<Vertex> OutgoingEdges {get;set;} 
} 
+0

दिलचस्प। मुझे क्रॉस-प्लेटफ़ॉर्म समर्थन की आवश्यकता है, इसलिए शायद मैं आपके प्रोटोबफ-नेट एक्सटेंशन का उपयोग नहीं कर सकता। लेकिन मैं उत्सुक हूं कि आपने इसे कैसे कार्यान्वित किया - यानी, अमूर्तता की आपकी परत के नीचे क्या है? –

+1

@ एडवर्ड मूल रूप से, प्रत्येक को चुपचाप एक संदेश के अंदर घोंसला किया जाता है (एक कुंजी के माध्यम से पूर्व-मौजूदा वस्तु का लिंक), या एक आईडी (धारावाहिक द्वारा उत्पन्न नई कुंजी) और उप-संदेश। लेकिन क्योंकि धारावाहिक इंजन इसे संभालता है, कार्यान्वयन उपयोगकर्ता के लिए अपारदर्शी है –

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