解析具有固定长度字段的可变长度数组的消息

本文关键字:数组 消息 字段 | 更新日期: 2023-09-27 18:05:24

我需要解析(并构建)固定长度的基于文本的消息,这些消息在某些情况下可能包含数组字段。
例子:

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中的属性装饰方法似乎是一个很好的解决方案,我正在考虑扩展它,但我想确保我没有错过更好的解决方案。

解析具有固定长度字段的可变长度数组的消息

我相信我以前也做过类似的事情。

我解决这个问题的方法是使用自定义属性。这允许我创建类和嵌套对象,它们完全按照规范中的描述来描述我的数据,并使用自定义属性来描述数据属性(长度、类型、填充要求,如果需要的话,等等)。

我也最终为类和属性编写了一个自定义序列化/反序列化,但是这实际上是特定于实际应用程序的,因为数据是通过自定义政府协议发送的,该协议还通过带有延续码等加密套接字以固定大小的块或数据包发送和接收数据。

教程
  • http://msdn.microsoft.com/en-us/library/aa288454%28v=vs.71%29.aspx
  • http://www.codeproject.com/KB/cs/attributes.aspx
  • http://www.devx.com/dotnet/Article/11579