コード例 #1
0
        public override void Write(Writer writer, T[,] obj)
        {
            base.Write(writer, obj);
            var stream  = writer.Stream;
            int length  = obj.GetLength(0);
            int length2 = obj.GetLength(1);

            stream.WriteByte(TagList);
            if (length > 0)
            {
                ValueWriter.WriteInt(stream, length);
            }
            stream.WriteByte(TagOpenbrace);
            var serializer = Serializer <T> .Instance;

            for (int i = 0; i < length; ++i)
            {
                writer.AddReferenceCount(1);
                stream.WriteByte(TagList);
                if (length2 > 0)
                {
                    ValueWriter.WriteInt(stream, length2);
                }
                stream.WriteByte(TagOpenbrace);
                for (int j = 0; j < length2; ++j)
                {
                    serializer.Serialize(writer, obj[i, j]);
                }
                stream.WriteByte(TagClosebrace);
            }
            stream.WriteByte(TagClosebrace);
        }
コード例 #2
0
        public override void Write(Writer writer, T obj)
        {
            // No reference to exception
            writer.AddReferenceCount(1);
            var stream = writer.Stream;

            stream.WriteByte(TagError);
            stream.WriteByte(TagString);
            ValueWriter.Write(stream, obj.Message);
        }
コード例 #3
0
        public override void Write(Writer writer, T obj)
        {
            base.Write(writer, obj);
            var rows   = obj.Rows;
            var length = rows.Count;
            var stream = writer.Stream;

            stream.WriteByte(TagList);
            if (length == 0)
            {
                stream.WriteByte(TagOpenbrace);
                stream.WriteByte(TagClosebrace);
                return;
            }
            ValueWriter.WriteInt(stream, length);
            stream.WriteByte(TagOpenbrace);
            var columns = obj.Columns;
            int count   = columns.Count;
            int r       = writer.WriteClass(columns, () => {
                stream.WriteByte(TagClass);
                ValueWriter.Write(stream, obj.TableName);
                ValueWriter.Write(stream, count);
                stream.WriteByte(TagOpenbrace);
                var strSerializer = Serializer <string> .Instance;
                for (int i = 0; i < count; ++i)
                {
                    strSerializer.Serialize(writer, Accessor.UnifiedName(columns[i].ColumnName));
                }
                stream.WriteByte(TagClosebrace);
            });
            var serializer = Serializer.Instance;

            for (int i = 0; i < length; ++i)
            {
                writer.AddReferenceCount(1);
                stream.WriteByte(TagObject);
                ValueWriter.WriteInt(stream, r);
                stream.WriteByte(TagOpenbrace);
                if (count > 0)
                {
                    var row = rows[i];
                    for (int j = 0; j < count; ++j)
                    {
                        serializer.Serialize(writer, row[j]);
                    }
                }
                stream.WriteByte(TagClosebrace);
            }
            stream.WriteByte(TagClosebrace);
        }
コード例 #4
0
        public override void Write(Writer writer, T obj)
        {
            MembersWriter membersWriter = MembersWriter.GetMembersWriter <T>(writer.Mode);
            int           count         = membersWriter.count;
            var           stream        = writer.Stream;
            var           type          = typeof(T);
            int           r             = writer.WriteClass(type, () => {
                var data = membersWriter.data;
                stream.Write(data, 0, data.Length);
                writer.AddReferenceCount(count);
            });

            base.Write(writer, obj);
            stream.WriteByte(TagObject);
            ValueWriter.WriteInt(stream, r);
            stream.WriteByte(TagOpenbrace);
            if (count > 0)
            {
                ((Action <Writer, T>)(membersWriter.write))(writer, obj);
            }
            stream.WriteByte(TagClosebrace);
        }
コード例 #5
0
        public override void Write(Writer writer, T obj)
        {
            base.Write(writer, obj);
            Array array = (Array)(object)obj;
            int   rank  = array.Rank;
            int   i;

#if NETSTANDARD2_1 || NETCOREAPP2_1_UP
            Span <int> lb  = stackalloc int[rank];
            Span <int> ub  = stackalloc int[rank];
            Span <int> len = stackalloc int[rank];
#else
            int[] lb  = new int[rank];
            int[] ub  = new int[rank];
            int[] len = new int[rank];
#endif
            int[] loc     = new int[rank];
            int   maxrank = rank - 1;
            for (i = 0; i < rank; ++i)
            {
                lb[i]  = array.GetLowerBound(i);
                ub[i]  = array.GetUpperBound(i);
                len[i] = array.GetLength(i);
                loc[i] = lb[i];
            }
            var stream = writer.Stream;
            stream.WriteByte(TagList);
            if (len[0] > 0)
            {
                ValueWriter.WriteInt(stream, len[0]);
            }
            stream.WriteByte(TagOpenbrace);
            var serializer = Serializer.Instance;
            while (loc[0] <= ub[0])
            {
                int n = 0;
                for (i = maxrank; i > 0; i--)
                {
                    if (loc[i] == lb[i])
                    {
                        n++;
                    }
                    else
                    {
                        break;
                    }
                }
                for (i = rank - n; i < rank; ++i)
                {
                    writer.AddReferenceCount(1);
                    stream.WriteByte(TagList);
                    if (len[i] > 0)
                    {
                        ValueWriter.WriteInt(stream, len[i]);
                    }
                    stream.WriteByte(TagOpenbrace);
                }
                for (loc[maxrank] = lb[maxrank];
                     loc[maxrank] <= ub[maxrank];
                     loc[maxrank]++)
                {
                    serializer.Serialize(writer, array.GetValue(loc));
                }
                for (i = maxrank; i > 0; i--)
                {
                    if (loc[i] > ub[i])
                    {
                        loc[i] = lb[i];
                        loc[i - 1]++;
                        stream.WriteByte(TagClosebrace);
                    }
                }
            }
            stream.WriteByte(TagClosebrace);
        }