2013-01-23 9 views
6

FIXメッセージ用のカスタム.NETシリアライザ/デシリアライザ(XMLとは異なります)を記述したいと思います。基本的には、メッセージが<tag>=<value>;<tag>=<value>;...カスタムPOCOシリアライザ/デシリアライザの作成方法は?

として符号化されるだから、サンプル1は次のようになります。

51=2;20=hello;31=2 
私はシリアライズすることができるように、私はXmlSerializerクラスを使用する方法と同じように私のFIXシリアライザクラスを使用したい

/デシリアライズメッセージ。私は、このようなシリアライザ/デシリアライザを書くだろうか上の

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

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

任意のポインタ:私は、私のようなFIXメッセージクラスを記述想像でしょうか?

+1

ルック:(ServiceStackから)JSV、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シリアライザに基づいてオブジェクトをシリアライザブルとして識別しやすくなります。 –

+0

あなたの言っていることが分かります。実装するはずのインターフェイスがありますか?あなたは他の人の例を書いていますか?何も見つかりませんでしたので、落とし穴を避けていますか? – Denis

+0

Eli、よろしく! – Denis

関連する問題