2013-01-23 9 views
6

Chciałbym napisać niestandardowy serializator/deserializer .NET dla wiadomości FIX (które nie są podobne do XML). Zasadniczo wiadomość jest kodowana jako <tag>=<value>;<tag>=<value>;...Jak napisać niestandardowy serializator/deserializer POCO?

więc próbka jeden może być:

51=2;20=hello;31=2 

Chciałbym używać mojego FIX serializer klasę podobny do sposobu używam klasy XMLSerializer móc serializacji/Cofnięcie wiadomości. Mogę sobie wyobrazić, by napisać FIX klasę komunikat:

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

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

Wszelkie wskazówki, w jaki chciałbym napisać taki serializer/Deserializator?

+1

Spójrz na istniejących projektów open-source: JSV (od ServiceStack), Json.NET, Protobuf.NET itd mnóstwo istniejącego kodu/dokumentacja. Istnieje również wiele [prostych] sztuczek, które często są stosowane w celu przyspieszenia serializacji lub dopuszczenia punktów dostosowywania, itp. –

+1

@ pst, powinieneś umieścić to jako odpowiedź. To było pomocne! – Denis

+0

Cieszę się, że to było użyteczne - Zapraszam do szczegółowego przedstawienia poszukiwań/potencjalnych klientów/podejścia/wyniku w autoodpowiedzi :) –

Odpowiedz

6

Używając odbicia można przechodzić przez właściwości serializowanego obiektu, a następnie dla każdej właściwości można sprawdzić atrybuty (ponownie za pomocą odbicia). I na koniec wysyłasz swoje wyniki do strumienia.

Twój kod mógłby wyglądać następująco (uproszczony):

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

A zamiast (lub oprócz) oznaczania czegoś jako "Serializowalnego" można dodać nowy atrybut o nazwie "FixSerializable" '. Ułatwiłoby to identyfikację obiektów jako serializowanych na podstawie serializatora FIX. –

+0

Widzę, co mówisz. Czy jest jakiś interfejs, który powinienem wdrożyć? Czy masz jakieś przykłady innych osób piszących - nie mogłem ich znaleźć, więc unikam pułapek? – Denis

+0

Eli, dobry telefon! – Denis