2013-01-23 34 views
6

मैं FIX संदेशों के लिए एक कस्टम .NET serializer/deserializer लिखना चाहता हूं (जो एक्सएमएल की तरह नहीं हैं)। मूल रूप से संदेश <tag>=<value>;<tag>=<value>;...कस्टम पॉको सीरिएलाइज़र/deserializer कैसे लिखें?

रूप में कोडित है तो एक नमूना एक हो सकता है:

51=2;20=hello;31=2 

मैं क्रमानुसार करने में सक्षम होने की मेरी ठीक Serializer वर्ग तरह से मैं XmlSerializer वर्ग का उपयोग करने के लिए इसी तरह उपयोग करना चाहते हैं/deserialize संदेश। मैं कल्पना कर सकते हैं मैं की तरह एक ठीक संदेश वर्ग लिखते थे:

[Serializable] 
public class FixMessage 
{ 
    [FIXValuePair(51)] 
    public double Price { get; set; } 

    [FIXValuePair(20)] 
    public string SomethingElse { get; set; } 
} 

कैसे मैं इस तरह के एक Serializer/deserializer लिखते थे पर कोई संकेत?

+1

देखो: JSV (ServiceStack से), Json.NET, Protobuf.NET, आदि मौजूदा कोड बहुत/प्रलेखन। ऐसी कई [सरल] चालें भी होती हैं जिन्हें अक्सर क्रमबद्ध करने के लिए लागू किया जाता है, या अनुकूलन बिंदु आदि को अनुमति देता है। –

+1

@pst, आपको इसे एक उत्तर के रूप में रखना चाहिए। वह सहायक था! – Denis

+0

खुशी है कि यह उपयोगी था - अपने अन्वेषण/लीड/दृष्टिकोण/परिणाम को आत्म-उत्तर में विस्तारित करने के लिए स्वतंत्र महसूस करें :) –

उत्तर

6

प्रतिबिंब का उपयोग करके आप उस ऑब्जेक्ट के गुणों के माध्यम से लूप कर सकते हैं, जिसे आप क्रमबद्ध कर रहे हैं, फिर प्रत्येक प्रॉपर्टी के लिए आप गुणों की जांच कर सकते हैं (फिर प्रतिबिंब का उपयोग करके)। और अंत में आप अपने आउटपुट को स्ट्रीम में भेजते हैं।

आपका कोड कुछ इस तरह (सरलीकृत) दे सकता है: मौजूदा खुला स्रोत परियोजनाओं पर

public string Serialize(object o) 
{ 
    string result = ""; // TODO: use string builder 

    Type type = o.GeyType(); 

    foreach (var pi in type.GetProperties()) 
    { 
     string name = pi.Name; 
     string value = pi.GetValue(o, null).ToString(); 

     object[] attrs = pi.GetCustomAttributes(true); 
     foreach (var attr in attrs) 
     { 
      var vp = attr as FIXValuePairAttribute; 
      if (vp != null) name = vp.Name; 
     } 

     result += name + "=" + value + ";"; 
    } 

    return result; 
} 
+3

और 'Serializable' के रूप में कुछ चिह्नित करने के बजाय (या इसके अतिरिक्त) में आप एक नई विशेषता जोड़ सकते हैं जिसे' FixSerializable 'कहा जाता है '। इससे ऑब्जेक्ट्स को पहचानना आसान हो जाएगा क्योंकि आपके FIX serializer के आधार पर serializable। –

+0

मैं देख रहा हूँ कि आप क्या कह रहे हैं। क्या कुछ इंटरफेस है जिसे मैं कार्यान्वित करना चाहता हूं? क्या आपके पास अन्य लोगों को लिखने का कोई उदाहरण है - मुझे कोई भी नहीं मिला, इसलिए मैं किसी भी नुकसान से बचता हूं? – Denis

+0

एली, अच्छी कॉल! – Denis