将数据从xml模型序列化为自定义二进制格式

时间:2016-03-05 08:38:20

标签: c# serialization recursive-datastructures

我在这里寻求有关如何处理我的问题的建议,并知道是否已经有一些像这样工作的工具,我不知道...... 好吧,我必须使用他们的自定义二进制文件格式将大量数据从我的系统传递到另一个系统以交换数据。 我有许多(tlv like)二进制文件生成,我正在搜索如何实现我的目标,只是没有手写到很多代码因为我被告知 文件格式很快就会发展。

例如,这里有我在系统中的2个表(产品列表及其在不同iso代码中的标签):

产品表:

----------
SAL_PRODUCT
----------
ID号码(3)
VENDOR_ID号码(3)
MODEL_REF VARCHAR2(30)
----------


产品标签表:

----------
SAL_PRODUCT_LABEL
----------
PRODUCT_ID NUMBER(3)
ISO_LANG_CODE VARCHAR2(5)
LABEL VARCHAR2(40)
----------


我必须生成一个类似于这个结构的二进制文件:

  • [字节大小]< - 消息字节的总大小
  • [Elm-count]< - 产品数量

    • [字节大小]< - 第一条消息的字节大小(产品编号1)

    • [ID]< - 1字节产品ID

    • [VENDORID]< - 1字节产品供应商ID

      • [Elm-count]< - 产品标签数量

        • [字节大小]< - 第一条消息的字节大小(产品标签n°1) n°1)

        • [LANG_ID]< - 5个字符长度的字符串ISO lang代码

        • [LABELID]< - String当前lang_id的产品编号为1的标签 30个字符长度

我发现我必须创建一个能够使用xml元数据文件的文件生成器,如下所示:

<messages type="product" select="select ID,VENDOR_ID, MODEL_REF from SAL_PRODUCT order by 1">

    <message>

        <prop type="ID"/>
        <prop type="VENDOR_ID" />

        <messages type="labels" select="select product_id, ISO_LANG_CODE as LANGID, LABEL from  SAL_PRODUCT_LABEL" joinclause="product.ID = labels.product_id " >

           <message  >  
            <prop type="LANGID" />
            <prop type="LABEL" />
           </message>


        </messages>

        <prop type="MODEL_REF"/>

    </message>  


</messages>     

但我所有的C#代码都应该是动态的,能够解析并使用嵌套结构.... 从这里我不知道如何处理我的问题:

  • 我选择了正确的解决方案吗?

  • 你会如何处理这类问题?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

最简单的方法之一是通过以下两个步骤来完成:

1。创建强类型模型类

使用强类型模型类。它们可以是手写/ generated类来反序列化XML,或者,如果使用某些现有数据库存储,则可以使用Entity Framework database first approach从现有数据库表创建它们。

它会给你什么? - 你的数据不需要任何自定义描述符(我的意思是那些看起来不那么漂亮的XML格式描述符)。数据模型将自己定义它们的格式(加上可能还有一些属性),并且由于管理不当或不是最新的序列化配置而导致的错误风险将大大降低。

有什么缺点吗? - 好吧,版本不是那么容易(我的意思是序列化或反序列化旧文件) - 你必须为每个版本使用一个模型(如{{1每个二进制文件格式版本(ModelV1, ModelV2...)和一个序列化程序。但是,通过动态结构,实现起来会更加困难。

2。创建自定义序列化程序

据我所知,.NET框架不提供任何标准的序列化 - 反序列化基础结构,您可以轻松地将自定义序列化器集成到其中。

嗯,有SerializerFormatV1, SerializerFormatV2...接口和整个基础架构 - https://msdn.microsoft.com/en-us/library/ty01x675(v=vs.110).aspx,但这主要是.NET 2.0时间技术(未在DataContractSerializer或Protobuf / Newtonsoft.Json中使用序列化框架)。你坚持不会得到任何东西。

因此,您应该只实现自定义序列化程序,它将反映您的模型类型的属性,并根据该自定义二进制格式编写数据。

如何枚举所有属性 - Recursively Get Properties & Child Properties Of A Class

类似自定义序列化程序的示例(仅适用于平面文本文件) - Custom serialization of an object in .NET

这将是:

ISerializable

还有一些你应该注意的事情:

  1. 嵌套结构 - 枚举属性时不要忘记正确重复序列化嵌套结构。
  2. 循环参考 - 这有点困难,我找不到任何关于如何做的好建议。但是如果你的数据不能有这样的东西,那么你可能是安全的。
  3. 版本控制 - 曾几何时格式会更改您自己的数据或二进制文件格式。但是你仍然需要处理旧数据。怎么处理?正如我在步骤1中已经说过的那样 - 使用版本标记的数据和序列化程序。一些关于“版本容忍序列化”的互联网搜索将为您提供更多想法。