C# поддерживает автоматическую пользовательскую сериализацию / десериализацию через атрибуты? - PullRequest
1 голос
/ 09 января 2020

Погуглив вокруг, я получаю много смешанных результатов со старых. NET версий и т. Д.

При заданном протоколе сообщений:

  • Байт 0-1 : Идентификатор типа сообщения
  • Байт 2: Номер сообщения
  • Байт 3: Размер полезной нагрузки
  • Байт 4 ... n-1: Данные полезной нагрузки
  • Байт n, n + 1: контрольная сумма

Я хочу написать C# класс Message, который может сериализоваться и десериализоваться с byte[], который в идеале мог бы иметь в качестве своего ядра что-то вроде этого (я использую свойства, но члены в порядке, если это важно)

class Message
{
 public Int16 Type {get; set;}
 public byte Number {get; set;}
 public byte PayloadSize {get; set;}
 public byte[] Payload{get; set;}
 public Int16 CheckSum {get; set;}
}

Конечно, написать код для этого достаточно просто, но я знаю. NET имеет некоторые автоматические c (де) функции сериализации, которые было бы неплохо избежать ошибок кодирования в унылом коде котельной плиты. Однако мне нужно гарантировать порядок, и т. Д. c, чтобы был соблюден протокол.

Позволяет ли современный. NET Framework (4.x) позволить автоматизировать это, и если да, то что это? Как, например, контролируется порядок следования атрибутов? И как мне на самом деле создавать экземпляры и сериализовать объекты из / в byte[]?

Я должен добавить, я знаю, что можно написать такую ​​вещь, используя отражение, но решение, которое требует больше работы, чем решаемой проблемы не очень полезно. Также я не заинтересован в использовании некоторой библиотеки кода, если она не очень хорошо протестирована, это действительно вопрос встроенных возможностей C#.

1 Ответ

0 голосов
/ 09 января 2020

Я думал о наложении вроде этого

    [StructLayout(LayoutKind.Explicit, Size = 128)]
    struct Message
    {
        [FieldOffset(0)]
        public byte[] data;
        [FieldOffset(0)]
        public Int16 Type;
        [FieldOffset(2)]
        public byte Number;
        [FieldOffset(3)]
        public byte PayloadSize;
        [FieldOffset(4)]
        public Int16 type;
        [FieldOffset(6)]
        public byte[] Payload;
        [FieldOffset(126)]
        public Int16 CheckSum;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...