在现代应用程序和系统中,数据通常以众所周知的数据格式如XML/JSON等进行传输。然而,在以前,系统使用专有数据格式,其中数据生产者和消费者之间约定了一个预定义的固定大小的原始结构,并将其写入平面文件或通过线路传输。
令人惊讶的是,不久前,当需要硬件设备通过HTTP传输与服务器通信时,决定使用这种“老式”的做法,以实现最小的消息大小。
提出了一个框架,它帮助开发者使用声明而不是硬编码来创建和解析这种类型的数据,从而实现美观、可维护且经过验证的代码,并且工作量最小。
尽管这个框架最初是为处理小块数据设计的,但还是做了一些工作,使其也能处理平面文件。
使用这个框架非常简单,只需要做以下几步:
[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属性提供格式化和定位数据的指令。这些指令包括以下特点:
性能问题:没有。尽管大量使用反射,已经努力只在图/方案构建阶段使用一次,因此没有引入性能问题。
可扩展性:框架提供了几个可扩展点。
框架的自定义配置节使能够定义一个格式化程序,它将被调用,对于每个标记有FormatterName的属性。
框架不支持循环引用,一个对象不能持有对其自身类型的引用。请使用简单对象!