1 module hunt.serialization.BinarySerializer; 2 3 import std.array : Appender; 4 import std.traits; 5 import hunt.serialization.Specify; 6 7 8 /** 9 * 10 */ 11 struct BinarySerializer { 12 private { 13 Appender!(ubyte[]) _buffer; 14 } 15 16 ubyte[] oArchive(T)(T val) if (!isArray!T && !isAssociativeArray!T) { 17 Unqual!T copy = val; 18 specify(this, copy); 19 return _buffer.data(); 20 } 21 22 ubyte[] oArchive(T)(const ref T val) 23 if (!isDynamicArray!T && !isAssociativeArray!T && !isAggregateType!T) { 24 T copy = val; 25 specify(this, copy); 26 return _buffer.data(); 27 } 28 29 ubyte[] oArchive(T)(const(T)[] val) { 30 auto copy = (cast(T[]) val).dup; 31 specify(this, copy); 32 return _buffer.data(); 33 } 34 35 ubyte[] oArchive(K, V)(const(V[K]) val) { 36 auto copy = cast(V[K]) val.dup; 37 specify(this, copy); 38 return _buffer.data(); 39 } 40 41 void putUbyte(ref ubyte val) { 42 _buffer.put(val); 43 } 44 45 void putClass(T)(T val) if (is(T == class)) { 46 specifyClass(this, val); 47 } 48 49 void putRaw(ubyte[] val) { 50 _buffer.put(val); 51 } 52 53 bool isNullObj() { 54 return false; 55 } 56 57 }