示例#1
0
        private static void WriteData(Stream stream, object t, Type type, SerializeTypeInfo dataInfo)
        {
            if (t == null)
            {
                stream.WriteBool(false);
                return;
            }
            else
            {
                stream.WriteBool(true);
            }

            var finfo   = dataInfo.FieldData;
            var refinfo = SerializeTypeInfo.GetFieldInfos(type);

            for (var i = 0; i < finfo.Count; i++)
            {
                var fdata = finfo[i];

                var fvalue = refinfo[i].GetValue(t);
                if (fdata.IsPrimitive)
                {
                    if (fdata.IsArray)
                    {
                        if (fvalue == null)
                        {
                            stream.WriteBool(false);
                        }
                        else
                        {
                            stream.WriteBool(true);
                            var array = fvalue as Array;
                            stream.WriteUInt32((uint)array.Length);
                            if (array.Length != 0)
                            {
                                WritePrimitiveDataArray(stream, fdata.TypeEnum, array);
                            }
                        }
                    }
                    else
                    {
                        WritePrimitiveData(stream, fdata.TypeEnum, fvalue);
                    }
                }
                else
                {
                    if (fvalue == null)
                    {
                        stream.WriteBool(false);
                    }
                    else
                    {
                        stream.WriteBool(true);
                        var customTypeIndex = fdata.CustomTypeIndex;
                        var customTypeInfo  = dataInfo.CustomDataTypeInfo[customTypeIndex];
                        if (fdata.IsArray)
                        {
                            var array = fvalue as Array;
                            stream.WriteInt32(array.Length);
                            if (array.Length != 0)
                            {
                                for (var j = 0; j < array.Length; j++)
                                {
                                    WriteData(stream, array.GetValue(j), fdata.ElementType, customTypeInfo);
                                }
                            }
                        }
                        else
                        {
                            if (customTypeInfo == null)
                            {
                                throw new Exception("Custom datatype info missing");
                            }
                            //write value
                            WriteData(stream, fvalue, fvalue.GetType(), customTypeInfo);
                        }
                    }
                }
            }
        }
示例#2
0
        private static object ReadData(Type type, Stream stream, SerializeTypeInfo dataInfo)
        {
            bool objNotNull = stream.ReadBool();

            if (!objNotNull)
            {
                return(null);
            }
            var    fieldInfo = SerializeTypeInfo.GetFieldInfos(type);
            object t         = Activator.CreateInstance(type);

            var finfo = dataInfo.FieldData;

            for (var i = 0; i < finfo.Count; i++)
            {
                var fdata = finfo[i];
                if (fdata.IsPrimitive)
                {
                    if (fdata.IsArray)
                    {
                        bool notNull = stream.ReadBool();
                        if (notNull == false)
                        {
                            fieldInfo[i].SetValue(t, null);
                        }
                        else
                        {
                            var length = stream.ReadUInt32();
                            var ary    = ReadPrimitiveDataArray(stream, fdata.TypeEnum, (int)length);
                            fieldInfo[i].SetValue(t, ary);
                        }
                    }
                    else
                    {
                        var val = ReadPrimitiveData(stream, fdata.TypeEnum);
                        fieldInfo[i].SetValue(t, val);
                    }
                }
                else
                {
                    var notNull = stream.ReadBool();
                    if (notNull)
                    {
                        var customTypeIndex = fdata.CustomTypeIndex;
                        var customTypeInfo  = dataInfo.CustomDataTypeInfo[customTypeIndex];
                        if (fdata.IsArray)
                        {
                            var arylength = stream.ReadInt32();
                            var array     = Array.CreateInstance(fdata.ElementType, arylength);

                            if (arylength == 0)
                            {
                                fieldInfo[i].SetValue(t, array);
                            }
                            else
                            {
                                for (var j = 0; j < arylength; j++)
                                {
                                    var obj = ReadData(fdata.ElementType, stream, customTypeInfo);
                                    array.SetValue(obj, j);
                                }
                                fieldInfo[i].SetValue(t, array);
                            }
                        }
                        else
                        {
                            if (customTypeInfo == null)
                            {
                                throw new Exception("Custom datatype info missing");
                            }
                            var eobj = ReadData(fdata.FieldType, stream, customTypeInfo);
                            fieldInfo[i].SetValue(t, eobj);
                        }
                    }
                    else
                    {
                        fieldInfo[i].SetValue(t, null);
                    }
                }
            }
            return(t);
        }