对象转二进制--》二进制转对象

 /// <summary>
        /// 转换为二进制(只涉及属性字段)
        /// </summary>
        /// <returns></returns>
        public byte[] ToBinary()
        {
            MemoryStream ms = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(ms);


            //固定字段
            bw.Write(_ID);
            bw.Write(_GUID);
            bw.Write(_TableName);


            //遍历对象属性(代码优先原则)
            object obj = this;
            PropertyInfo[] pis = obj.GetType().GetProperties();
            foreach (PropertyInfo pi in pis)
            {
                object[] attrs = pi.GetCustomAttributes(typeof(RSFDBFieldAttribute), true);
                if (attrs.Length == 1)
                {
                    RSFDBFieldAttribute attr = (RSFDBFieldAttribute)attrs[0];
                    bw.Write((int)attr.FieldUsage);                                     //写入字段类别
                    bw.Write(attr.FieldName);                                           //写入字段名


                    //普通,或者1对1模式
                    if (attr.FieldUsage == EnumDBFieldUsage.None || attr.FieldUsage == EnumDBFieldUsage.Relationship_O2O)
                    {
                        string PropertyTypeName = pi.PropertyType.Name;
                        if (pi.PropertyType.BaseType.ToString() == "System.Enum")
                            PropertyTypeName = "System.Enum";
                        bw.Write(PropertyTypeName);                                     //写入字段类型
                        switch (PropertyTypeName)
                        {
                            case "DateTime":
                                {
                                    DateTime value = (DateTime)pi.GetValue(obj, null);
                                    //value = DateTime.FromOADate(0.0);
                                    bw.Write(value.ToOADate());
                                } break;
                            case "String":
                                {
                                    string value = (string)pi.GetValue(obj, null);
                                    if (value == null)
                                        value = "";
                                    bw.Write(value);
                                } break;
                            case "System.Enum":
                                {
                                    int value = (int)pi.GetValue(obj, null);
                                    bw.Write(value);
                                } break;
                            case "Int32":
                                {
                                    int value = (int)pi.GetValue(obj, null);
                                    bw.Write(value);
                                } break;
                            case "Double":
                                {
                                    double value = (double)pi.GetValue(obj, null);
                                    bw.Write(value);
                                } break;
                            case "Byte[]":
                                {
                                    byte[] value = (byte[])pi.GetValue(obj, null);
                                    if (value == null)
                                        bw.Write((int)0);
                                    else
                                    {
                                        bw.Write(value.Length);
                                        bw.Write(value);
                                    }
                                } break;


                            default: Debug.Assert(false); break;
                        }
                    }
                    //1对多模式
                    else if (attr.FieldUsage == EnumDBFieldUsage.Relationship_O2M)
                    {
                        //遍历所有子对象
                        IRSFDBRecordCollection rs = this.GetCollection_O2M(attr.FieldName);
                        //子对象数目
                        bw.Write(rs.Count);
                        //子对象数据
                        for (int n = 0; n < rs.Count; n++)
                        {
                            RSFDBObject subObject = rs[n];
                            byte[] value = subObject.ToBinary();
                            if (value == null)
                                bw.Write((int)0);
                            else
                            {
                                bw.Write(value.Length);
                                bw.Write(value);
                            }
                        }
                    }
                }
            }


            byte[] bytes = ms.ToArray();
            bw.Close();
            ms.Close();
            return bytes;
        }


        /// <summary>
        /// 从二进制中获取(只涉及属性字段)
        /// </summary>
        /// <returns></returns>
        public bool FromBinary(byte[] bytes)
        {
            MemoryStream ms = new MemoryStream(bytes);
            BinaryReader br = new BinaryReader(ms);


            //固定字段
            _ID = br.ReadInt32();
            _GUID = br.ReadString();
            string vTableName = br.ReadString();
            if (vTableName != _TableName)
            {
                Debug.Assert(false);
                br.Close();
                ms.Close();
                return false;
            }


            while (ms.Position < (long)bytes.Length)
            {
                EnumDBFieldUsage FieldUsage = (EnumDBFieldUsage)br.ReadInt32();     //字段类别
                string FieldName = br.ReadString();                                 //字段名


                //普通,或者1对1模式
                if (FieldUsage == EnumDBFieldUsage.None || FieldUsage == EnumDBFieldUsage.Relationship_O2O)
                {
                    string PropertyTypeName = br.ReadString();                          //字段类型
                    object value = null;
                    switch (PropertyTypeName)
                    {
                        case "DateTime":
                            {
                                value = DateTime.FromOADate(br.ReadDouble());
                            } break;
                        case "String":
                            {
                                value = br.ReadString();
                            } break;
                        case "System.Enum":
                            {
                                value = br.ReadInt32();
                            } break;
                        case "Int32":
                            {
                                value = br.ReadInt32();
                            } break;
                        case "Double":
                            {
                                value = br.ReadDouble();
                            } break;
                        case "Byte[]":
                            {
                                int nCount = br.ReadInt32();
                                if (nCount > 0)
                                    value = br.ReadBytes(nCount);
                            } break;


                        default: Debug.Assert(false); break;
                    }


                    //遍历对象属性(代码优先原则)
                    object obj = this;
                    PropertyInfo[] pis = obj.GetType().GetProperties();
                    bool IsFind = false;
                    foreach (PropertyInfo pi in pis)
                    {
                        object[] attrs = pi.GetCustomAttributes(typeof(RSFDBFieldAttribute), true);
                        if (attrs.Length == 1)
                        {
                            RSFDBFieldAttribute attr = (RSFDBFieldAttribute)attrs[0];
                            if (attr.FieldName == FieldName)
                            {
                                if (PropertyTypeName == "System.Enum")
                                    value = Enum.Parse(pi.PropertyType, value.ToString(), true);
                                //赋值
                                pi.SetValue(obj, value, null);
                                IsFind = true;
                                break;
                            }
                        }
                    }
                    Debug.Assert(IsFind == true);
                }
                //1对多模式
                else if (FieldUsage == EnumDBFieldUsage.Relationship_O2M)
                {
                    //遍历所有子对象
                    IRSFDBRecordCollection rs = this.GetCollection_O2M(FieldName);
                    IRSFDBRecordCollection2 rs2 = rs as IRSFDBRecordCollection2;


                    if (rs2 == null)
                    {
                        //找huangw
                        Debug.Assert(false, "需要将rs实现IRSFDBRecordCollection2接口,才能在基类状态下创建元素的实体对象");
                    }
                    //子对象数目
                    int Count = br.ReadInt32();
                    //子对象数据
                    for (int n = 0; n < Count; n++)
                    {
                        RSFDBObject subObject = rs2.AddObject(); //新对象
                        int nCount = br.ReadInt32();
                        if (nCount > 0)
                        {
                            byte[] value = br.ReadBytes(nCount);
                            if (value != null)
                                subObject.FromBinary(value);
                        }
                    }
                }
            }


            br.Close();
            ms.Close();
            return true;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值