Cerealed v0.6.1: even less boilerplate for binary serialization

Atila Neves via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Mon Aug 3 02:40:58 PDT 2015


On Monday, 3 August 2015 at 09:27:03 UTC, Dicebot wrote:
> On Monday, 3 August 2015 at 09:21:50 UTC, Atila Neves wrote:
>> The summary is you can now write this:
>>
>>     struct UdpPacket {
>>         static struct Header {
>>             ushort srcPort;
>>             ushort dstPort;
>>             ushort length;
>>             ushort checksum;
>>         }
>>
>>         enum headerSize = unalignedSizeof!Header;
>>         alias header this;
>>
>>         Header header;
>>         @LengthInBytes("length - headerSize") ubyte[] data;
>>     }
>>
>
> This deserialization will be identical to casting like this, 
> right? (Not trying to diminish your work, just making sure I 
> get semantics :))
>
> align(1)
> struct UdpPacket
> {
>     align(1)
>     static struct Header {
>         ushort srcPort;
>         ushort dstPort;
>         ushort length;
>         ushort checksum;
>     }
>
>     Header   header;
>     ubyte[0] data;
> }
>
> // ...
>
> auto packet = cast(UdpPacket*) raw_data.ptr;

In this case, yes. In the real-life case I was simplifying, it 
wasn't a ubyte[] array, it was an array of structs with 
non-trivial serialisation that also depended on a previous 
deserialised variable. It was more like this:

struct Outer {
    static struct Header { ... }
    Header header;
    @LengthInBytes("length - headerSize") Inner[] array;
}

struct Inner {
     static struct Header { ... }
     Header header;
     @ArrayLength("length") Unit[] units; //actual length of the 
array instead of in bytes
}

struct Unit { ... }

So maybe not as useless after all ;)

Atila




More information about the Digitalmars-d-announce mailing list