固定大小数据格式框架介绍

在现代应用程序和系统中,数据通常以众所周知的数据格式如XML/JSON等进行传输。然而,在以前,系统使用专有数据格式,其中数据生产者和消费者之间约定了一个预定义的固定大小的原始结构,并将其写入平面文件或通过线路传输。

令人惊讶的是,不久前,当需要硬件设备通过HTTP传输与服务器通信时,决定使用这种“老式”的做法,以实现最小的消息大小。

提出了一个框架,它帮助开发者使用声明而不是硬编码来创建和解析这种类型的数据,从而实现美观、可维护且经过验证的代码,并且工作量最小。

尽管这个框架最初是为处理小块数据设计的,但还是做了一些工作,使其也能处理平面文件。

使用代码

使用这个框架非常简单,只需要做以下几步:

  1. 引用DLL并添加适当的using语句。
  2. 定义一个表示原始数据的类(推荐使用POCO),并使用FixedSizeContract属性进行装饰。
  3. 使用实际表示数据结构的属性装饰那些类属性。
  4. 调用FixedSizeStreamReader或FixedSizeStreamWriter来为完成工作。
[FixedSizeContract] public class Student { [FixedSizeMember(Order = 0, Length = 20, PaddingMode = PaddingMode.Right, PaddingChar = '\'')] public string Name { get; set; } [FixedSizeMember(Order = 1, Length = 10, PaddingMode = PaddingMode.Left, PaddingChar = '0')] public string ID { get; set; } [NumericFixedSizeMember(Order = 2, Length = 3, NumberStyles = NumberStyles.Number)] public int Weight { get; set; } [NumericFixedSizeMember(Order = 3, Length = 3, NumberStyles = NumberStyles.Number, FormatterName = "MyCustomContainerName")] public int Height { get; set; } [BooleanFixedSizeMember(Order = 4, Length = 1, TrueValue = "T", Falsevalue = "F")] public bool Good { get; set; } [FixedSizeMember(Order = 5, Length = 8, Format = "yyyyMMdd")] public DateTime BirthDate { get; set; } [SpecialNumber(Order = 6, Length = 3, AddtionalStuff = 123)] public int MyProperty { get; set; } }

上面的代码展示了如何定义数据结构(布局)以及如何将对象读取和写入文件。

特点

框架通过DataMember属性提供格式化和定位数据的指令。这些指令包括以下特点:

  • 属性布局:应该总是声明属性的顺序,否则属性将按照它们在代码中出现的顺序定位。
  • 组合:如果一个对象是另一个对象的组合,那么该对象将作为一个简单属性完全布局,然后剩余的属性将被格式化。
  • 继承:基类属性总是位于子类之前。
  • 长度和填充:在每个属性上,将设置其长度。如果需要,可以定义填充行为,甚至可以让填充字符从FixedSizeContract类继承。
  • 有效载荷数据:可以允许最后一个数据字段(属性)使用非固定长度。框架允许将一个属性标记为有效载荷,这个属性将不使用填充或任何长度限制。
  • 头部:可以为文件中的第一个原始数据定义不同的类型,甚至可以将头部数据设置在单独的文件中。
  • LINQ:由于所有数据都表示为CLR对象,可以使用任何容器并进行查询。

性能问题:没有。尽管大量使用反射,已经努力只在图/方案构建阶段使用一次,因此没有引入性能问题。

可扩展性:框架提供了几个可扩展点。

  • 首先,可以添加自己的ICustomFormatter并注册其类型。在这种情况下,每当调用特定类型时。然而,可以通过命名使用同一类型的多个格式化程序。
  • 还可以创建自己的DataMember属性,通过继承CustomFixedSizedMemberAttribute,这样将能够为数据结构提供额外的特性。

配置

框架的自定义配置节使能够定义一个格式化程序,它将被调用,对于每个标记有FormatterName的属性。

限制和已知问题

框架不支持循环引用,一个对象不能持有对其自身类型的引用。请使用简单对象!

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485