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

Serialize data from xml model into custom binary format

我在这里寻找有关如何处理我的问题的建议,并想知道是否已经有一些我不知道的工具可以像这样工作... 好吧,我必须使用他们自定义的二进制文件格式将大量数据从我的系统传送到另一个系统以交换数据。 我有很多这样的(类似 tlv 的)二进制文件要生成,我正在寻找如何在不手写太多代码的情况下简单地实现我的目标,因为有人告诉我 文件格式很快就会发展。

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

Table 个产品:

------------
SAL_PRODUCT
----------
身份证号码(3)
VENDOR_ID 数字 (3)
MODEL_REF VARCHAR2(30)
----------


Table 个产品标签:

------------
SAL_PRODUCT_LABEL
----------
PRODUCT_ID 数字 (3)
ISO_LANG_CODE VARCHAR2(5)
标签 VARCHAR2(40)
----------


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

我发现我必须创建一个能够使用 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。创建强类型模型 类

使用强类型模型类。它们可以是手写的/generated classes to deserialize XML to, or, if you use some existing database storage, then Entity Framework database first approach 可用于从现有数据库表创建它们。

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

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

2。创建自定义序列化器

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

嗯,有 ISerializable 接口和它上面的整个基础设施 - https://msdn.microsoft.com/en-us/library/ty01x675(v=vs.110).aspx , but that's mostly .NET 2.0 time tech (not used in either DataContractSerializer 或 Protobuf/Newtonsoft。Json 序列化框架)。坚持下去你不会得到任何东西。

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

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

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

它将是这样的:

public class OtherCompanyBinaryFormatSerializer
{
    public void Serialize<T>(Stream stream, T object); { ... }
    public T Deserialize<T>(Stream stream); { ... }
}

还有一些需要注意的事项:

  1. 嵌套结构 - 在枚举属性时不要忘记正确地重复序列化嵌套结构。
  2. 循环引用 - 这有点困难,我找不到关于如何做的任何好的建议。但是如果你的数据不能有这样的东西,那么你可能是安全的。
  3. 版本控制 - 曾几何时,您自己的数据或二进制文件格式的格式发生了变化。但是您仍然需要处理旧数据。如何处理?正如我在第 1 步中所说的那样 - 使用版本标记数据和序列化程序。 "version tolerant serialization" 上的一些互联网搜索会给你更多的想法。