Разбор сообщений с массивами переменной длины полей фиксированной длины - PullRequest
2 голосов
/ 12 августа 2011

У меня есть необходимость анализировать (и создавать) текстовые сообщения фиксированной длины, которые в некоторых случаях могут содержать поля массива.
Пример:

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 кажется отличным чистым решением, и я думаю просто расширить его, но я хочу убедиться, что я не пропустил лучшего решения.

1 Ответ

1 голос
/ 12 августа 2011

Я считаю, что в прошлом я делал нечто очень похожее.

Я решил эту проблему с помощью пользовательских атрибутов.Это позволило мне создавать классы и вложенные объекты, которые описывали мои данные в точности так, как описано в спецификации, и использовали настраиваемые атрибуты для описания атрибутов данных (длина, тип, требования к заполнению, если требуется и т. Д.).

Я также закончилдо написания настраиваемой сериализации / десериализации для классов и атрибутов, однако это было действительно специфично для реального приложения, поскольку данные поступали через специальный правительственный протокол, который также отправлял и получал данные в виде фрагментов или пакетов фиксированного размера через зашифрованные сокеты с кодами продолжения и т. д..

Учебные пособия

...