コード例 #1
0
        protected override byte[] OnConvertToBytes(IList list, IMarshalingProvider pool)
        {
            var c    = pool.Construct();
            var type = list.GetType();

            if (type.IsGenericType)
            {
                var generic = type.GetGenericArguments()[0];    // <TYPE>
                var typeDef = type.GetGenericTypeDefinition();  // IList<>

                c.Attach <byte>(2);
                c.Attach(generic);
                c.Attach(typeDef);

                c.Attach(list.Count);
                foreach (var item in list)
                {
                    c.Attach(generic, item);
                }
            }
            else // IList<object>
            {
                var typeWithoutGeneric = type;

                c.Attach <byte>(1);
                c.Attach(type);

                c.Attach(list.Count);
                foreach (object item in list)
                {
                    c.Attach(item);
                }
            }
            return(c);
        }
コード例 #2
0
ファイル: DataTableMarshaller.cs プロジェクト: fossabot/Melt
        protected override byte[] OnConvertToBytes(DataTable table, IMarshalingProvider pool)
        {
            var c = pool.Construct();

            c.Attach(table.TableName);
            c.Attach(table.Namespace);

            var columns = table.Columns.Cast <DataColumn>().ToArray();

            c.Attach(columns);

            var rows = table.Rows.Cast <DataRow>().ToArray();

            c.Attach(rows.Length);

            foreach (var row in rows)
            {
                foreach (var col in columns)
                {
                    var item = row[col];
                    c.Attach(col.DataType, item);
                }
            }
            return(c);
        }
コード例 #3
0
        protected override byte[] OnConvertToBytes(object graph, IMarshalingProvider pool)
        {
            var type = graph.GetType();

            byte[] result = pool.Construct().Attach(type).Attach(type, graph);
            return(result);
        }
コード例 #4
0
        protected override Array OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d       = pool.Deconstruct(bytes);
            var element = d.Detach <Type>();
            var count   = d.Detach <int>(out length);
            var array   = Array.CreateInstance(element, count);

            if (count == 0)
            {
                goto Leave;
            }
            if (count != 1)
            {
                for (int i = 0; i < count - 1; i++)
                {
                    var current = d.Detach(element);
                    array.SetValue(current, i);
                }
            }
            var last = d.Detach(element, out length);

            array.SetValue(last, count - 1);

Leave:
            return(array);
        }
コード例 #5
0
ファイル: DictionaryMarshaller.cs プロジェクト: fossabot/Melt
        protected override byte[] OnConvertToBytes(IDictionary dict, IMarshalingProvider pool)
        {
            var type = dict.GetType();
            var c    = pool.Construct();

            if (type.IsGenericType && s_dictTypes.Contains(type.GetGenericTypeDefinition()))
            {
                c.Attach <byte>(2); // Strong Type Convertion
                c.Attach(dict.Count);
                var ga        = type.GetGenericArguments();
                var keyType   = ga[0];
                var valyeType = ga[1];
                c.Attach(keyType);
                c.Attach(valyeType);

                foreach (DictionaryEntry entry in dict)
                {
                    c.Attach(keyType, entry.Key);
                    c.Attach(valyeType, entry.Value);
                }
            }
            else
            {
                c.Attach <byte>(1); // Weak Type Convertion
                c.Attach(dict.Count);
                c.Attach(type);

                foreach (DictionaryEntry entry in dict)
                {
                    c.Attach(entry.Key);
                    c.Attach(entry.Value);
                }
            }
            return(c);
        }
コード例 #6
0
        protected override object OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d     = pool.Deconstruct(bytes);
            var type  = d.Detach <Type>();
            var value = d.Detach(type, out length);

            return(value);
        }
コード例 #7
0
        protected override byte[] OnConvertToBytes(DataSet dataSet, IMarshalingProvider pool)
        {
            var c = pool.Construct();

            c.Attach(dataSet.DataSetName);
            var tables = dataSet.Tables.Cast <DataTable>().ToArray();

            return(c.Attach(tables));
        }
コード例 #8
0
        protected override Enum OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d           = pool.Deconstruct(bytes);
            var enumType    = d.Detach <Type>();
            var underlyType = Enum.GetUnderlyingType(enumType);
            var value       = d.Detach(underlyType, out length);

            return((Enum)Enum.ToObject(enumType, value));
        }
コード例 #9
0
        protected override Test OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d   = pool.Deconstruct(bytes);
            var obj = new Test();

            obj.Data1 = d.Detach <int>();
            obj.Data2 = d.Detach <string>(out length);
            return(obj);
        }
コード例 #10
0
        protected override IList OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d    = pool.Deconstruct(bytes);
            var flag = d.Detach <byte>();

            if (flag == 2)
            {
                var generic = d.Detach <Type>();
                var typeDef = d.Detach <Type>();
                var count   = d.Detach <int>(out length);

                var listType = typeDef.MakeGenericType(generic);
                var list     = (IList)Activator.CreateInstance(listType);
                if (count == 0)
                {
                    goto Leave;
                }

                if (count != 1)
                {
                    for (int i = 0; i < count - 1; i++)
                    {
                        list.Add(d.Detach(generic));
                    }
                }

                list.Add(d.Detach(generic, out length));
Leave:
                return(list);
            }
            else if (flag == 1)
            {
                var listType = d.Detach <Type>();
                var count    = d.Detach <int>(out length);

                var list = (IList)Activator.CreateInstance(listType);

                if (count == 0)
                {
                    goto Leave;
                }

                if (count != 1)
                {
                    for (int i = 0; i < count - 1; i++)
                    {
                        list.Add(d.Detach <object>());
                    }
                }

                list.Add(d.Detach <object>(out length));
Leave:
                return(list);
            }

            throw new NotSupportedException();
        }
コード例 #11
0
        protected override byte[] OnConvertToBytes(Enum graph, IMarshalingProvider pool)
        {
            var type           = graph.GetType();
            var underlyingType = Enum.GetUnderlyingType(type);
            var c = pool.Construct();

            c.Attach(type);
            c.Attach(underlyingType, graph);
            return(c);
        }
コード例 #12
0
        protected override Regex OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d           = pool.Deconstruct(bytes);
            var options     = (RegexOptions)d.Detach <short>();
            var timeSpan    = d.Detach <TimeSpan>();
            var regex       = d.Detach <string>(out length);
            var regexObject = new Regex(regex, options, timeSpan);

            return(regexObject);
        }
コード例 #13
0
        protected override DataSet OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d           = pool.Deconstruct(bytes);
            var dataSetName = d.Detach <string>();
            var dataSet     = new DataSet(dataSetName);
            var tables      = d.Detach <DataTable[]>(out length);

            dataSet.Tables.AddRange(tables);
            return(dataSet);
        }
コード例 #14
0
        protected override byte[] OnConvertToBytes(ITuple graph, IMarshalingProvider pool)
        {
            var c = pool.Construct();

            c.Attach(graph.Length);
            for (int i = 0; i < graph.Length; i++)
            {
                var current = graph[i];
                c.Attach(current);
            }
            return(c);
        }
コード例 #15
0
        protected override byte[] OnConvertToBytes(string graph, IMarshalingProvider pool)
        {
            if (string.Equals(graph, string.Empty))
            {
                return(_empty);
            }

            var value  = Encoding.Unicode.GetBytes(graph);
            var result = ConcatLenAndPayload(value);

            return(result);
        }
コード例 #16
0
ファイル: BigIntegerMarshaller.cs プロジェクト: fossabot/Melt
        protected override byte[] OnConvertToBytes(BigInteger graph, IMarshalingProvider pool)
        {
            var bi = graph.ToByteArray();
            var c  = pool.Construct();

            c.Attach(bi.Length);
            for (int i = 0; i < bi.Length; i++)
            {
                c.Attach(bi[i]);
            }
            return(c);
        }
コード例 #17
0
ファイル: MarshallerBase`1.cs プロジェクト: fossabot/Melt
        public T FromBytes(byte[] bytes, out int spanLength, IMarshalingProvider pool)
        {
            spanLength = 0;
            if (bytes == null || bytes.Length == 0)
            {
                throw new ArgumentNullException(nameof(bytes));
            }

            if (IsDefaultValueBytes(bytes))
            {
                spanLength = DefaultValueBytes.Length;
                return(default);
コード例 #18
0
        protected override byte[] OnConvertToBytes(Array list, IMarshalingProvider pool)
        {
            var c           = pool.Construct();
            var elementType = list.GetType().GetElementType();

            c.Attach(elementType);
            c.Attach(list.Length);
            for (int i = 0; i < list.Length; i++)
            {
                c.Attach(elementType, list.GetValue(i));
            }
            return(c);
        }
コード例 #19
0
ファイル: TypeMarshaller.cs プロジェクト: fossabot/Melt
        protected override byte[] OnConvertToBytes(Type graph, IMarshalingProvider pool)
        {
            var c = pool.Construct();

            if (TypeMap.TryGet(graph.AssemblyQualifiedName, out var code))
            {
                c.Attach(code);
            }
            else
            {
                c.Attach(0x7FFFFFFF).Attach(graph.AssemblyQualifiedName);
            }
            return(c);
        }
コード例 #20
0
ファイル: SupportedTypesTest.cs プロジェクト: fossabot/Melt
        public void Init()
        {
            p     = Marshallers.Common;
            table = new DataTable("Test");
            table.Columns.Add("Test1");
            table.Columns.Add("Test2");

            for (int i = 0; i < 10; i++)
            {
                var row = table.NewRow();
                row[0] = i;
                row[1] = 1 << i;
                table.Rows.Add(row);
            }
        }
コード例 #21
0
        protected override string OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var span = bytes.AsSpan();

            if (span.Length == _empty.Length && _empty.AsSpan().SequenceEqual(span.Slice(0, _empty.Length)))
            {
                length = _empty.Length;
                return(string.Empty);
            }

            var payload = SeparateLenAndPayload(bytes, out length);
            var result  = Encoding.Unicode.GetString(payload);

            return(result);
        }
コード例 #22
0
ファイル: TypeMarshaller.cs プロジェクト: fossabot/Melt
        protected override Type OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d    = pool.Deconstruct(bytes);
            var code = d.Detach <int>(out length);

            if (TypeMap.TryGet(code, out var typeString))
            {
                return(Type.GetType(typeString));
            }
            if (code == 0x7FFFFFFF)
            {
                return(Type.GetType(d.Detach <string>(out length)));
            }

            throw new InvalidCastException("Dislocation, unregistered type or not type not matched.");
        }
コード例 #23
0
            protected override byte[] OnConvertToBytes(TSelf graph, IMarshalingProvider pool)
            {
                var c = pool.Construct();

                foreach (var carried in _carrieds)
                {
                    var getter = carried.GetValue(graph);
                    c.Attach(getter.GetType(), getter);
                }

                byte[] bytes = c;
                for (int i = 0; i < s_pipes.Count; i++)
                {
                    bytes = s_pipes[i].Inflow(bytes);
                }
                return(bytes);
            }
コード例 #24
0
        protected override ITuple OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d            = pool.Deconstruct(bytes);
            var maxStackSize = d.Detach <int>();
            var values       = new Stack <object>(maxStackSize);

            for (int i = 0; i < maxStackSize - 1; i++)
            {
                var current = d.Detach <object>();
                values.Push(current);
            }
            var last = d.Detach <object>(out length);

            values.Push(last);

            return(CreateByArgs(values, maxStackSize));
        }
コード例 #25
0
        protected override byte[] OnConvertToBytes(DataColumn column, IMarshalingProvider pool)
        {
            var c = pool.Construct()
                    .Attach(column.ColumnName)
                    .Attach(column.DataType)
                    .Attach(column.Expression)
                    .Attach((byte)column.ColumnMapping)

                    .Attach(column.AllowDBNull)
                    .Attach(column.AutoIncrement)
                    .Attach(column.AutoIncrementSeed)
                    .Attach(column.AutoIncrementStep)
                    .Attach(column.Caption)
                    .Attach((byte)column.DateTimeMode)
                    .Attach(column.MaxLength)
                    .Attach(column.Namespace)
                    .Attach(column.ReadOnly)
                    .Attach(column.Unique);

            return(c);
        }
コード例 #26
0
 protected override byte[] OnConvertToBytes(byte graph, IMarshalingProvider pool) => new byte[1]
 {
     graph
 };
コード例 #27
0
 protected override byte OnConvertFromBytes(byte[] bytes, IMarshalingProvider pool) => bytes[0];
コード例 #28
0
ファイル: BigIntegerMarshaller.cs プロジェクト: fossabot/Melt
        protected override BigInteger OnConvertFromBytes(byte[] bytes, out int length, IMarshalingProvider pool)
        {
            var d     = pool.Deconstruct(bytes);
            var len   = d.Detach <int>(out length);
            var array = new byte[len];

            if (len == 0)
            {
                goto Leave;
            }
            if (len != 1)
            {
                for (int i = 0; i < len - 1; i++)
                {
                    array[i] = d.Detach <byte>();
                }
            }
            array[len - 1] = d.Detach <byte>(out length);

Leave:
            return(new BigInteger(array));
        }
コード例 #29
0
 protected override byte[] OnConvertToBytes(Guid graph, IMarshalingProvider pool) => graph.ToByteArray();
コード例 #30
0
 protected override Guid OnConvertFromBytes(byte[] bytes, IMarshalingProvider pool) => new Guid(bytes.AsSpan(0, SpanSize).ToArray());