MemoryStream Writer Class
using System; using System.Collections.Generic; using System.IO; using System.Numerics; using System.Reflection; using System.Text; public class MemoryStreamWriter : IDisposable { public static string[] Readerwritertypes = { "BOOLN ", //0 "CHAR ", //1 "BYTE ", //2 "SBYTE ", //3 "SHORT ", //4 "USHORT ", //5 "INTEGER ", //6 "UINTEGER ", //7 "LONG ", //8 "ULONG ", //9 "STRING ", //10 "FLOAT ", //11 "DOUBLE ", //12 "DECIMAL ", //13 "BOOLARRY ", //14 "CHARARRY ", //15 "BYTEARRY ", //16 "SBYTEARRY ", //17 "SHORTARRY ", //18 "USHORTARRY ", //19 "INTARRY ", //20 "UINTARRY ", //21 "LONGARRY ", //22 "ULONGARRY ", //23 "STRINGARRY ", //24 "FLOATARRY ", //25 "DOUBLEARRY ", //26 "DECIMALARRY ", //27 "BIGINTEGER ", //28 "BIGINTARRY ", //29 "BIGRATIONAL ", //30 "BIGRATARRY ", //31 "DATETIME ", //32 "DATETIMEARRY", //33 "REFVALUETYPE" //34 }; private readonly Encoder _encoder; private readonly Encoding _encoding; public MemoryStreamWriter() : this(null, new UTF8Encoding(false, true)) { } public MemoryStreamWriter(Stream input) : this(input, new UTF8Encoding()) { } public MemoryStreamWriter(Stream input, Encoding encoding) { if (input == null) BaseStream = new MemoryStream(); else BaseStream = input; _encoding = encoding; _encoder = _encoding.GetEncoder(); } public Stream BaseStream { get; } public static int PrimitiveOverHead => sizeof(int); public static int ArrayOverHead => sizeof(int) * 2; public void Dispose() { if (BaseStream == null) return; if (BaseStream.CanWrite) { BaseStream.Flush(); } BaseStream.Dispose(); } public long Seek(int offset, SeekOrigin origin) { return BaseStream.Seek(offset, origin); } public void SetData(IEnumerable<object> obja) { if (obja != null) foreach (var o in obja) Write(o); } public void Write(object obj) { var ltype = obj.GetType(); switch (ltype.Name.Trim('[', ']')) { case "Byte": if (!ltype.IsArray) Write((byte) obj); else Write((byte[]) obj); return; case "Boolean": if (!ltype.IsArray) Write((bool) obj); else Write((bool[]) obj); return; case "SByte": if (!ltype.IsArray) Write((sbyte) obj); else Write((sbyte[]) obj); return; case "Char": if (!ltype.IsArray) Write((char) obj); else Write((char[]) obj); return; case "Int16": if (!ltype.IsArray) Write((short) obj); else Write((short[]) obj); return; case "UInt16": if (!ltype.IsArray) Write((ushort) obj); else Write((ushort[]) obj); return; case "Int32": if (!ltype.IsArray) Write((int) obj); else Write((int[]) obj); return; case "UInt32": if (!ltype.IsArray) Write((uint) obj); else Write((uint[]) obj); return; case "Int64": if (!ltype.IsArray) Write((long) obj); else Write((long[]) obj); return; case "UInt64": if (!ltype.IsArray) Write((ulong) obj); else Write((ulong[]) obj); return; case "Single": if (!ltype.IsArray) Write((float) obj); else Write((float[]) obj); return; case "Double": if (!ltype.IsArray) Write((double) obj); else Write((double[]) obj); return; case "String": if (!ltype.IsArray) Write((string) obj); else Write((string[]) obj); return; case "Decimal": if (!ltype.IsArray) Write((decimal) obj); else Write((decimal[]) obj); return; case "DateTime": if (!ltype.IsArray) Write((DateTime) obj); else Write((DateTime[]) obj); return; case "BigInteger": if (!ltype.IsArray) Write((BigInteger)obj); else Write((BigInteger[])obj); return; } if (ltype.IsSerializable) { var flds = ltype.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy); if (flds.Length > 0) { BaseStream.Write(Readerwritertypes[34].GetBytes(), 0, 4); var buf = obj.ObjectToByteArray(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); return; } throw new Exception("Serializable Value and Reference Types, no meaningful data can be found."); } throw new Exception("Unsupported Type."); } private void Write(bool value) { var head = _encoding.GetBytes(Readerwritertypes[0]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private unsafe void Write(char value) { var head = _encoding.GetBytes(Readerwritertypes[1]); BaseStream.Write(head, 0, head.Length); var buf = new byte[2]; int len; fixed (byte* bytes2 = buf) { len = _encoder.GetBytes(&value, 1, bytes2, buf.Length, true); } BaseStream.Write(buf, 0, len); } private void Write(byte value) { var head = _encoding.GetBytes(Readerwritertypes[2]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(sbyte value) { var head = _encoding.GetBytes(Readerwritertypes[3]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(short value) { var head = _encoding.GetBytes(Readerwritertypes[4]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(ushort value) { var head = _encoding.GetBytes(Readerwritertypes[5]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(int value) { var head = _encoding.GetBytes(Readerwritertypes[6]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(uint value) { var head = _encoding.GetBytes(Readerwritertypes[7]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(long value) { var head = _encoding.GetBytes(Readerwritertypes[8]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(ulong value) { var head = _encoding.GetBytes(Readerwritertypes[9]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(string value) { var head = _encoding.GetBytes(Readerwritertypes[10]); BaseStream.Write(head, 0, head.Length); var count = _encoding.GetByteCount(value); var cbuf = count.GetBytes(); BaseStream.Write(cbuf, 0, cbuf.Length); var LBuffer = new byte[count]; _encoding.GetBytes(value, 0, value.Length, LBuffer, 0); BaseStream.Write(LBuffer, 0, LBuffer.Length); } private void Write(float value) { var head = _encoding.GetBytes(Readerwritertypes[11]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(double value) { var head = _encoding.GetBytes(Readerwritertypes[12]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(decimal value) { var head = _encoding.GetBytes(Readerwritertypes[13]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf, 0, buf.Length); } private void Write(BigInteger value) { var head = _encoding.GetBytes(Readerwritertypes[28]); BaseStream.Write(head, 0, head.Length); var buf = value.ToByteArray(); var lbuf = buf.Length; var labb = lbuf.GetBytes(); BaseStream.Write(labb, 0, labb.Length); BaseStream.Write(buf, 0, buf.Length); } private void Write(BigRational value) { var head = _encoding.GetBytes(Readerwritertypes[30]); BaseStream.Write(head, 0, head.Length); var Num = value.Numerator.ToByteArray(); var lnum = Num.Length; var lnab = lnum.GetBytes(); BaseStream.Write(lnab, 0, lnab.Length); BaseStream.Write(Num, 0, Num.Length); var Den = value.Denominator.ToByteArray(); var lden = Den.Length; var ldab = lden.GetBytes(); BaseStream.Write(ldab, 0, ldab.Length); BaseStream.Write(Den, 0, Den.Length); } private void Write(DateTime value) { var head = _encoding.GetBytes(Readerwritertypes[32]); BaseStream.Write(head, 0, head.Length); var asl = value.ToBinary(); var vbuf = BitConverter.GetBytes(asl); var lbuf = vbuf.Length; var lbufb = lbuf.GetBytes(); BaseStream.Write(lbufb, 0, lbufb.Length); BaseStream.Write(vbuf, 0, vbuf.Length); } private void Write(bool[] value) { var head = _encoding.GetBytes(Readerwritertypes[14]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(char[] value) { var head = _encoding.GetBytes(Readerwritertypes[15]); BaseStream.Write(head, 0, head.Length); var bytes = _encoding.GetBytes(value, 0, value.Length); var bbuf = bytes.Length.GetBytes(); BaseStream.Write(bbuf, 0, bbuf.Length); BaseStream.Write(bytes, 0, bytes.Length); } private void Write(byte[] value) { var head = _encoding.GetBytes(Readerwritertypes[16]); BaseStream.Write(head, 0, head.Length); BaseStream.Write(value.Length.GetBytes(), 0, 4); BaseStream.Write(value, 0, value.Length); } private void Write(sbyte[] value) { var head = _encoding.GetBytes(Readerwritertypes[17]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(short[] value) { var head = _encoding.GetBytes(Readerwritertypes[18]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(ushort[] value) { var head = _encoding.GetBytes(Readerwritertypes[19]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(int[] value) { var head = _encoding.GetBytes(Readerwritertypes[20]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(uint[] value) { var head = _encoding.GetBytes(Readerwritertypes[21]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(long[] value) { var head = _encoding.GetBytes(Readerwritertypes[22]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(ulong[] value) { var head = _encoding.GetBytes(Readerwritertypes[23]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(string[] value) { var head = _encoding.GetBytes(Readerwritertypes[24]); BaseStream.Write(head, 0, head.Length); BaseStream.Write(value.Length.GetBytes(), 0, 4); foreach (var v in value) { var count = _encoding.GetByteCount(v); var cbuf = count.GetBytes(); BaseStream.Write(cbuf, 0, cbuf.Length); var LBuffer = new byte[count]; _encoding.GetBytes(v, 0, v.Length, LBuffer, 0); BaseStream.Write(LBuffer, 0, LBuffer.Length); } } private void Write(float[] value) { var head = _encoding.GetBytes(Readerwritertypes[25]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(double[] value) { var head = _encoding.GetBytes(Readerwritertypes[26]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(decimal[] value) { var head = _encoding.GetBytes(Readerwritertypes[27]); BaseStream.Write(head, 0, head.Length); var buf = value.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } private void Write(BigInteger[] value) { var head = _encoding.GetBytes(Readerwritertypes[29]); BaseStream.Write(head, 0, head.Length); var larr = value.Length; var larrab = larr.GetBytes(); BaseStream.Write(larrab, 0, larrab.Length); foreach (var v in value) { var buf = v.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } } private void Write(BigRational[] value) { var head = _encoding.GetBytes(Readerwritertypes[31]); BaseStream.Write(head, 0, head.Length); foreach (var v in value) { var buf = v.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } } private void Write(DateTime[] value) { var head = _encoding.GetBytes(Readerwritertypes[33]); BaseStream.Write(head, 0, head.Length); foreach (var v in value) { var buf = v.Ticks.GetBytes(); BaseStream.Write(buf.Length.GetBytes(), 0, 4); BaseStream.Write(buf, 0, buf.Length); } } }