{"id":372,"date":"2021-01-19T10:38:49","date_gmt":"2021-01-19T10:38:49","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=372"},"modified":"2021-01-19T10:38:49","modified_gmt":"2021-01-19T10:38:49","slug":"memorystreamwriter-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2021\/01\/19\/memorystreamwriter-cs\/","title":{"rendered":"MemoryStreamWriter.cs"},"content":{"rendered":"\n<p>MemoryStream Writer Class<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Numerics;\nusing System.Reflection;\nusing System.Text;\npublic class MemoryStreamWriter : IDisposable\n{\n    public static string[] Readerwritertypes =\n    {\n        \"BOOLN       \", \/\/0\n        \"CHAR        \", \/\/1\n        \"BYTE        \", \/\/2\n        \"SBYTE       \", \/\/3\n        \"SHORT       \", \/\/4\n        \"USHORT      \", \/\/5\n        \"INTEGER     \", \/\/6\n        \"UINTEGER    \", \/\/7\n        \"LONG        \", \/\/8\n        \"ULONG       \", \/\/9\n        \"STRING      \", \/\/10\n        \"FLOAT       \", \/\/11\n        \"DOUBLE      \", \/\/12\n        \"DECIMAL     \", \/\/13\n        \"BOOLARRY    \", \/\/14\n        \"CHARARRY    \", \/\/15\n        \"BYTEARRY    \", \/\/16\n        \"SBYTEARRY   \", \/\/17\n        \"SHORTARRY   \", \/\/18\n        \"USHORTARRY  \", \/\/19\n        \"INTARRY     \", \/\/20\n        \"UINTARRY    \", \/\/21\n        \"LONGARRY    \", \/\/22\n        \"ULONGARRY   \", \/\/23\n        \"STRINGARRY  \", \/\/24\n        \"FLOATARRY   \", \/\/25\n        \"DOUBLEARRY  \", \/\/26\n        \"DECIMALARRY \", \/\/27\n        \"BIGINTEGER  \", \/\/28\n        \"BIGINTARRY  \", \/\/29\n        \"BIGRATIONAL \", \/\/30\n        \"BIGRATARRY  \", \/\/31\n        \"DATETIME    \", \/\/32\n        \"DATETIMEARRY\", \/\/33\n        \"REFVALUETYPE\"  \/\/34\n    };\n    private readonly Encoder  _encoder;\n    private readonly Encoding _encoding;\n    public MemoryStreamWriter() : this(null, new UTF8Encoding(false, true))\n    {\n    }\n    public MemoryStreamWriter(Stream input) : this(input, new UTF8Encoding())\n    {\n    }\n    public MemoryStreamWriter(Stream input, Encoding encoding)\n    {\n        if (input == null)\n            BaseStream = new MemoryStream();\n        else\n            BaseStream = input;\n        _encoding = encoding;\n        _encoder  = _encoding.GetEncoder();\n    }\n    public Stream BaseStream\n    {\n        get;\n    }\n    public static int PrimitiveOverHead => sizeof(int);\n    public static int ArrayOverHead     => sizeof(int) * 2;\n    public void Dispose()\n    {\n        if (BaseStream == null) return;\n\n\n        if (BaseStream.CanWrite)\n        {\n            BaseStream.Flush();\n        }\n        BaseStream.Dispose();\n    }\n    public long Seek(int offset, SeekOrigin origin)\n    {\n        return BaseStream.Seek(offset, origin);\n    }\n    public void SetData(IEnumerable&lt;object> obja)\n    {\n        if (obja != null)\n            foreach (var o in obja)\n                Write(o);\n    }\n    public void Write(object obj)\n    {\n        var ltype = obj.GetType();\n        switch (ltype.Name.Trim('[', ']'))\n        {\n            case \"Byte\":\n                if (!ltype.IsArray)\n                    Write((byte) obj);\n                else\n                    Write((byte[]) obj);\n                return;\n            case \"Boolean\":\n                if (!ltype.IsArray)\n                    Write((bool) obj);\n                else\n                    Write((bool[]) obj);\n                return;\n            case \"SByte\":\n                if (!ltype.IsArray)\n                    Write((sbyte) obj);\n                else\n                    Write((sbyte[]) obj);\n                return;\n            case \"Char\":\n                if (!ltype.IsArray)\n                    Write((char) obj);\n                else\n                    Write((char[]) obj);\n                return;\n            case \"Int16\":\n                if (!ltype.IsArray)\n                    Write((short) obj);\n                else\n                    Write((short[]) obj);\n                return;\n            case \"UInt16\":\n                if (!ltype.IsArray)\n                    Write((ushort) obj);\n                else\n                    Write((ushort[]) obj);\n                return;\n            case \"Int32\":\n                if (!ltype.IsArray)\n                    Write((int) obj);\n                else\n                    Write((int[]) obj);\n                return;\n            case \"UInt32\":\n                if (!ltype.IsArray)\n                    Write((uint) obj);\n                else\n                    Write((uint[]) obj);\n                return;\n            case \"Int64\":\n                if (!ltype.IsArray)\n                    Write((long) obj);\n                else\n                    Write((long[]) obj);\n                return;\n            case \"UInt64\":\n                if (!ltype.IsArray)\n                    Write((ulong) obj);\n                else\n                    Write((ulong[]) obj);\n                return;\n            case \"Single\":\n                if (!ltype.IsArray)\n                    Write((float) obj);\n                else\n                    Write((float[]) obj);\n                return;\n            case \"Double\":\n                if (!ltype.IsArray)\n                    Write((double) obj);\n                else\n                    Write((double[]) obj);\n                return;\n            case \"String\":\n                if (!ltype.IsArray)\n                    Write((string) obj);\n                else\n                    Write((string[]) obj);\n                return;\n            case \"Decimal\":\n                if (!ltype.IsArray)\n                    Write((decimal) obj);\n                else\n                    Write((decimal[]) obj);\n                return;\n            case \"DateTime\":\n                if (!ltype.IsArray)\n                    Write((DateTime) obj);\n                else\n                    Write((DateTime[]) obj);\n                return;\n\n            case \"BigInteger\":\n                if (!ltype.IsArray)\n                    Write((BigInteger)obj);\n                else\n                    Write((BigInteger[])obj);\n                return;\n        }\n        if (ltype.IsSerializable)\n        {\n            var flds = ltype.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy);\n            if (flds.Length > 0)\n            {\n                BaseStream.Write(Readerwritertypes[34].GetBytes(), 0, 4);\n                var buf = obj.ObjectToByteArray();\n                BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n                BaseStream.Write(buf,                   0, buf.Length);\n                return;\n            }\n            throw new Exception(\"Serializable Value and Reference Types, no meaningful data can be found.\");\n        }\n        throw new Exception(\"Unsupported Type.\");\n    }\n    private void Write(bool value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[0]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private unsafe void Write(char value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[1]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = new byte[2];\n        int len;\n        fixed (byte* bytes2 = buf)\n        {\n            len = _encoder.GetBytes(&amp;value, 1, bytes2, buf.Length, true);\n        }\n        BaseStream.Write(buf, 0, len);\n    }\n    private void Write(byte value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[2]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(sbyte value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[3]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(short value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[4]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(ushort value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[5]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(int value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[6]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(uint value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[7]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(long value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[8]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(ulong value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[9]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(string value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[10]);\n        BaseStream.Write(head, 0, head.Length);\n        var count = _encoding.GetByteCount(value);\n        var cbuf  = count.GetBytes();\n        BaseStream.Write(cbuf, 0, cbuf.Length);\n        var LBuffer = new byte[count];\n        _encoding.GetBytes(value, 0, value.Length, LBuffer, 0);\n        BaseStream.Write(LBuffer, 0, LBuffer.Length);\n    }\n    private void Write(float value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[11]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(double value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[12]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(decimal value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[13]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf, 0, buf.Length);\n    }\n    private void Write(BigInteger value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[28]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf  = value.ToByteArray();\n        var lbuf = buf.Length;\n        var labb = lbuf.GetBytes();\n        BaseStream.Write(labb, 0, labb.Length);\n        BaseStream.Write(buf,  0, buf.Length);\n    }\n    private void Write(BigRational value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[30]);\n        BaseStream.Write(head, 0, head.Length);\n        var Num  = value.Numerator.ToByteArray();\n        var lnum = Num.Length;\n        var lnab = lnum.GetBytes();\n        BaseStream.Write(lnab, 0, lnab.Length);\n        BaseStream.Write(Num,  0, Num.Length);\n        var Den  = value.Denominator.ToByteArray();\n        var lden = Den.Length;\n        var ldab = lden.GetBytes();\n        BaseStream.Write(ldab, 0, ldab.Length);\n        BaseStream.Write(Den,  0, Den.Length);\n    }\n    private void Write(DateTime value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[32]);\n        BaseStream.Write(head, 0, head.Length);\n        var asl   = value.ToBinary();\n        var vbuf  = BitConverter.GetBytes(asl);\n        var lbuf  = vbuf.Length;\n        var lbufb = lbuf.GetBytes();\n        BaseStream.Write(lbufb, 0, lbufb.Length);\n        BaseStream.Write(vbuf,  0, vbuf.Length);\n    }\n    private void Write(bool[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[14]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(char[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[15]);\n        BaseStream.Write(head, 0, head.Length);\n        var bytes = _encoding.GetBytes(value, 0, value.Length);\n        var bbuf  = bytes.Length.GetBytes();\n        BaseStream.Write(bbuf,  0, bbuf.Length);\n        BaseStream.Write(bytes, 0, bytes.Length);\n    }\n    private void Write(byte[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[16]);\n        BaseStream.Write(head,                    0, head.Length);\n        BaseStream.Write(value.Length.GetBytes(), 0, 4);\n        BaseStream.Write(value,                   0, value.Length);\n    }\n    private void Write(sbyte[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[17]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(short[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[18]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(ushort[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[19]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(int[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[20]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(uint[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[21]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(long[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[22]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(ulong[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[23]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(string[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[24]);\n        BaseStream.Write(head,                    0, head.Length);\n        BaseStream.Write(value.Length.GetBytes(), 0, 4);\n        foreach (var v in value)\n        {\n            var count = _encoding.GetByteCount(v);\n            var cbuf  = count.GetBytes();\n            BaseStream.Write(cbuf, 0, cbuf.Length);\n            var LBuffer = new byte[count];\n            _encoding.GetBytes(v, 0, v.Length, LBuffer, 0);\n            BaseStream.Write(LBuffer, 0, LBuffer.Length);\n        }\n    }\n    private void Write(float[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[25]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(double[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[26]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(decimal[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[27]);\n        BaseStream.Write(head, 0, head.Length);\n        var buf = value.GetBytes();\n        BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n        BaseStream.Write(buf,                   0, buf.Length);\n    }\n    private void Write(BigInteger[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[29]);\n        BaseStream.Write(head, 0, head.Length);\n        var larr   = value.Length;\n        var larrab = larr.GetBytes();\n        BaseStream.Write(larrab, 0, larrab.Length);\n        foreach (var v in value)\n        {\n            var buf = v.GetBytes();\n            BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n            BaseStream.Write(buf,                   0, buf.Length);\n        }\n    }\n    private void Write(BigRational[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[31]);\n        BaseStream.Write(head, 0, head.Length);\n        foreach (var v in value)\n        {\n            var buf = v.GetBytes();\n            BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n            BaseStream.Write(buf,                   0, buf.Length);\n        }\n    }\n    private void Write(DateTime[] value)\n    {\n        var head = _encoding.GetBytes(Readerwritertypes[33]);\n        BaseStream.Write(head, 0, head.Length);\n        foreach (var v in value)\n        {\n            var buf = v.Ticks.GetBytes();\n            BaseStream.Write(buf.Length.GetBytes(), 0, 4);\n            BaseStream.Write(buf,                   0, buf.Length);\n        }\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>MemoryStream Writer Class<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[168,169],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/372"}],"collection":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/comments?post=372"}],"version-history":[{"count":1,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/372\/revisions"}],"predecessor-version":[{"id":373,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/372\/revisions\/373"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}