我需要解析(并构建)固定长度的基于文本的消息,在某些情况下可能包含数组字段 示例:
PARTA LOTA 02SUBLOT1 SUBLOT2 03TEST1 RESULT1 TEST2 RESULT2 TEST3 RESULT3
如果这是一个对象,它可能会使用下面的Lot对象
零件号(PARTA)
批号(LOTA)
2个SubLot对象的数组(SUBLOT1的数量为150,SUBLOT2的数量为999)
3个测试结果的数组(TEST1,结果1234.67890,......)
请注意,数组项的数量在消息中指定。
我希望使用我见过人们谈论的FileHelpers库,但它似乎不支持多个数组字段,其中有另一个字段指定数量,并且它不支持自己的字段类型具有[FixedLengthRecord()]的属性。
这是我希望能够做到的。请注意,字段长度10只是保持这种简单的工件。并非所有字段通常都以相同的长度定义。
[FixedLengthRecord()]
public class Lot
{
[FieldFixedLength(10)]
public string PartNumber { get; set; }
[FieldFixedLength(10)]
public string LotNumber { get; set; }
[FieldFixedLength(10)]
public SubLot[] SubLots { get; set; }
[FieldFixedLength(10)]
public Test[] Tests { get; set; }
}
[FixedLengthRecord()]
public class SubLot
{
[FieldFixedLength(10)]
public string SubLotNumber { get; set; }
[FieldFixedLength(10)]
public int Quantity { get; set; }
}
[FixedLengthRecord()]
public class Test
{
[FieldFixedLength(10)]
public string Description { get; set; }
[FieldFixedLength(10)]
public double Result { get; set; }
}
任何人都知道FileHelpers是否可以实现这一目标?还有其他想法吗?我有许多不同的消息类型,所以我宁愿不为每个消息类型手动编码。 FileHelpers中的属性修饰方法看起来像是一个非常干净的解决方案,我正在考虑扩展它,但我想确保我没有错过更好的解决方案。
答案 0 :(得分:1)
我相信我过去做过非常相似的事情。
我解决此问题的方法是使用自定义属性。这允许我创建类和嵌套对象,这些对象完全按照规范中的描述描述我的数据,并使用自定义属性来描述数据属性(长度,类型,填充要求,如果需要等)。
我还最终为类和属性编写了自定义序列化/反序列化,但这实际上特定于实际应用程序,因为数据来自自定义政府协议,该协议也以固定大小的块或数据包发送和接收数据带有延续代码等的加密套接字。
教程