2013-01-23 6 views
6

Ich möchte einen benutzerdefinierten .NET Serializer/Deserializer für FIX-Nachrichten schreiben (die nicht wie XML sind). Grundsätzlich wird die Nachricht codiert als <tag>=<value>;<tag>=<value>;...Wie schreibe ich einen benutzerdefinierten POCO Serializer/Deserializer?

So eine Probe könnte man sein:

51=2;20=hello;31=2 

Ich möchte meine FIX Serializer Klasse ähnlich wie ich die XMLSerializer Klasse verwenden, nutzen zu können serialisiert/deserialisieren Mitteilungen. Ich könnte mir vorstellen, ich eine FIX-Nachrichtenklasse wie schreiben würde:

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

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

Irgendwelche Hinweise, wie ich so einen Serializer/Deserializer schreiben würde?

+1

Blick auf bestehende Open-Source-Projekte: JSV (von ServiceStack), Json.NET, Protobuf.NET usw. Viele vorhandenen Code/Dokumentation. Es gibt auch eine Reihe von [einfachen] Tricks, die oft angewendet werden, um die Serialisierung zu beschleunigen oder Anpassungspunkte usw. zu ermöglichen. –

+1

@pst, Sie sollten das als Antwort verwenden. Das war hilfreich! – Denis

+0

Froh, dass es nützlich war - Fühlen Sie sich frei, Ihre Erkundung/Leads/Ansatz/Ergebnis in einer Selbst-Antwort zu geben :) –

Antwort

6

Mit der Reflektion können Sie die Eigenschaften des Objekts, das Sie serialisieren, durchlaufen. Anschließend können Sie für jede Eigenschaft nach Attributen suchen (wiederum mithilfe von Reflektion). Und am Ende senden Sie Ihre Ausgabe an einen Stream.

Ihr Code könnte wie folgt aussehen (vereinfacht):

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

Und anstatt (oder zusätzlich) etwas als 'Serializable' zu ​​markieren, können Sie ein neues Attribut namens' FixSerializable '. Dies würde es einfacher machen, die Objekte basierend auf Ihrem FIX-Serialisierer als serialisierbar zu identifizieren. –

+0

Ich sehe was du sagst. Gibt es eine Schnittstelle, die ich implementieren soll? Hast du irgendwelche Beispiele von anderen Menschen, die einen schreiben - ich konnte keinen finden, also vermeide ich irgendwelche Fallstricke? – Denis

+0

Eli, guten Ruf! – Denis

Verwandte Themen