如何编写自定义的POCO序列化器/反序列化器?

6
我希望编写一个自定义的.NET序列化器/反序列化器,用于FIX消息(与XML不同)。基本上,这条消息被编码为<tag>=<value>;<tag>=<value>;...。以下是示例:
51=2;20=hello;31=2

我希望可以像使用XMLSerializer类一样,使用我的FIX Serializer类来序列化/反序列化消息。我可以想象,我需要编写一个类似于以下的FIX消息类:

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

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

有没有任何提示可以帮助我编写这样的序列化/反序列化程序?

1
看看现有的开源项目:JSV(来自ServiceStack),Json.NET,Protobuf.NET等。有大量现有的代码/文档。还有许多[简单]技巧通常用于加速序列化,或允许定制点等。 - user166390
1
@pst,你应该把那个作为答案。那很有帮助! - Denis
很高兴它对你有用 - 请随意在自我回答中详细说明你的探索/线索/方法/结果 :) - user166390
1个回答

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
除了将某些东西标记为“可序列化”之外,您可以添加一个名为“FixSerializable”的新属性,以便更容易地基于您的FIX序列化程序将对象识别为可序列化。 - Eli Gassert
我明白你的意思。我应该实现某个接口吗?你有其他人编写的示例吗?我找不到任何示例,以避免任何陷阱。 - Denis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接