对象序列化补充

来源:互联网 发布:乐高 淘宝 代购 编辑:程序博客网 时间:2024/05/22 09:43
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;namespace DataBaseClassCollection{    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]    public class BaseCommunicationTypeA    {        public int operation_id;        public int param_a;        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]        public string param_d;        public int nested_param_e_array_size;        public BaseNestedParamE[] nested_param_e_array;        public int nested_param_f_array_size;        public BaseNestedParamF[] nested_param_f_array;        public double other_param;        public byte[] Serialize()        {            try            {                #region 计算长度                int TotalLength = 0;                int nested_param_e_array_index = 0;                int nested_param_f_array_index = 0;                TotalLength += Marshal.SizeOf(typeof(int));  //operation_id                TotalLength += Marshal.SizeOf(typeof(int));  //param_a                TotalLength += 20;  //param_d                TotalLength += Marshal.SizeOf(typeof(int));  //nested_param_e_array_size                TotalLength += Marshal.SizeOf(typeof(int));  //nested_param_e_array的指针                TotalLength += Marshal.SizeOf(typeof(int));  //nested_param_f_array_size                TotalLength += Marshal.SizeOf(typeof(int));  //nested_param_f_array的指针                TotalLength += Marshal.SizeOf(typeof(double));  //other_param                nested_param_e_array_index = TotalLength;                TotalLength += Marshal.SizeOf(typeof(BaseNestedParamE)) * nested_param_e_array_size;  //nested_param_e_array                nested_param_f_array_index = TotalLength;                TotalLength += Marshal.SizeOf(typeof(BaseNestedParamF)) * nested_param_f_array_size;  //nested_param_f_array                #endregion                #region 序列化                byte[] data = new byte[TotalLength];                int copyindex = 0;                unsafe                {                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //operation_id                    {                        Marshal.StructureToPtr(operation_id, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //param_a                    {                        Marshal.StructureToPtr(param_a, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    //param_d                    byte[] param_d_data = Encoding.Unicode.GetBytes(param_d);                    int param_d_data_length = param_d_data.Length > 20 ? 20 : param_d_data.Length;                    Array.Copy(param_d_data, 0, data, copyindex, param_d_data_length);                    param_d_data = null;                    copyindex += 20;                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_e_array_size                    {                        Marshal.StructureToPtr(nested_param_e_array_size, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_e_array的指针                    {                        Marshal.StructureToPtr(nested_param_e_array_index, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_f_array_size                    {                        Marshal.StructureToPtr(nested_param_f_array_size, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_f_array的指针                    {                        Marshal.StructureToPtr(nested_param_f_array_index, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(double))])  //other_param                    {                        Marshal.StructureToPtr(other_param, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(double)));                        copyindex += Marshal.SizeOf(typeof(double));                    }                    for (int i = 0; i < nested_param_e_array_size; i++)                    {                        Array.Copy(nested_param_e_array[i].Serialize(), 0, data, copyindex, Marshal.SizeOf(typeof(BaseNestedParamE)));                        copyindex += Marshal.SizeOf(typeof(BaseNestedParamE));                    }                    for (int i = 0; i < nested_param_f_array_size; i++)                    {                        Array.Copy(nested_param_f_array[i].Serialize(), 0, data, copyindex, Marshal.SizeOf(typeof(BaseNestedParamF)));                        copyindex += Marshal.SizeOf(typeof(BaseNestedParamF));                    }                    GC.Collect();                }                #endregion                return data;            }            catch (Exception ex)            {                throw new Exception("BaseCommunicationTypeA序列化失败", ex);            }        }        public void DeSerialize(byte[] Data)        {            try            {                #region 反序列化                int copyindex = 0;                unsafe                {                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //operation_id                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        operation_id = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //param_a                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        param_a = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    //param_d                    byte[] param_d_data = new byte[20];                    Array.Copy(Data, copyindex, param_d_data, 0, 20);                    param_d = Encoding.Unicode.GetString(param_d_data);                    param_d_data = null;                    copyindex += 20;                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_e_array_size                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        nested_param_e_array_size = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    int nested_param_e_array_index = 0;                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_e_array的指针                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        nested_param_e_array_index = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_f_array_size                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        nested_param_f_array_size = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    int nested_param_f_array_index = 0;                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //nested_param_f_array的指针                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        nested_param_f_array_index = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(double))])  //other_param                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(double)));                        other_param = (double)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(double));                        copyindex += Marshal.SizeOf(typeof(double));                    }                    //nested_param_e_array                    nested_param_e_array = new BaseNestedParamE[nested_param_e_array_size];                    byte[] nested_param_e_array_data = new byte[Marshal.SizeOf(typeof(BaseNestedParamE))];                    for (int i = 0; i < nested_param_e_array_size; i++)                    {                        Array.Clear(nested_param_e_array_data, 0, nested_param_e_array_data.Length);                        nested_param_e_array[i] = new BaseNestedParamE();                        Array.Copy(Data, copyindex, nested_param_e_array_data, 0, Marshal.SizeOf(typeof(BaseNestedParamE)));                        nested_param_e_array[i].DeSerialize(nested_param_e_array_data);                        copyindex += Marshal.SizeOf(typeof(BaseNestedParamE));                    }                    nested_param_e_array_data = null;                    //nested_param_f_array                    nested_param_f_array = new BaseNestedParamF[nested_param_f_array_size];                    byte[] nested_param_f_array_data = new byte[Marshal.SizeOf(typeof(BaseNestedParamF))];                    for (int i = 0; i < nested_param_f_array_size; i++)                    {                        Array.Clear(nested_param_f_array_data, 0, nested_param_f_array_data.Length);                        nested_param_f_array[i] = new BaseNestedParamF();                        Array.Copy(Data, copyindex, nested_param_f_array_data, 0, Marshal.SizeOf(typeof(BaseNestedParamF)));                        nested_param_f_array[i].DeSerialize(nested_param_f_array_data);                        copyindex += Marshal.SizeOf(typeof(BaseNestedParamF));                    }                    nested_param_f_array_data = null;                }                GC.Collect();                #endregion            }            catch (Exception ex)            {                throw new Exception("BaseCommunicationTypeA反序列化失败", ex);            }        }    }    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]    public class BaseNestedParamE    {        public int param_a;        public double param_b;        public int param_c;        public byte[] Serialize()        {            try            {                #region 计算长度                int TotalLength = 0;                TotalLength += Marshal.SizeOf(typeof(int));  //param_a                TotalLength += Marshal.SizeOf(typeof(double));  //param_b                TotalLength += Marshal.SizeOf(typeof(int)); //param_c                #endregion                #region 序列化                byte[] data = new byte[TotalLength];                int copyindex = 0;                unsafe                {                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //param_a                    {                        Marshal.StructureToPtr(param_a, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(double))])  //param_b                    {                        Marshal.StructureToPtr(param_b, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(double)));                        copyindex += Marshal.SizeOf(typeof(double));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //param_c                    {                        Marshal.StructureToPtr(param_c, (IntPtr)pobjdata, true);                        Marshal.Copy((IntPtr)pobjdata, data, copyindex, Marshal.SizeOf(typeof(int)));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    GC.Collect();                }                #endregion                return data;                #region 序列化old                //byte[] data = new byte[Marshal.SizeOf(typeof(BaseNestedParamE))];                //unsafe                //{                //    fixed (byte* pobjdata = new byte[data.Length])                //    {                //        Marshal.StructureToPtr(this, (IntPtr)pobjdata, true);                //        Marshal.Copy((IntPtr)pobjdata, data, 0, data.Length);                //        return data;                //    }                //}                #endregion            }            catch (Exception ex)            {                throw new Exception("BaseNestedParamE序列化失败", ex);            }        }        public void DeSerialize(byte[] Data)        {            try            {                #region 反序列化                int copyindex = 0;                unsafe                {                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //param_a                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        param_a = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(double))])  //param_b                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(double)));                        param_b = (double)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(double));                        copyindex += Marshal.SizeOf(typeof(double));                    }                    fixed (byte* pobjdata = new byte[Marshal.SizeOf(typeof(int))])  //param_c                    {                        Marshal.Copy(Data, copyindex, (IntPtr)pobjdata, Marshal.SizeOf(typeof(int)));                        param_c = (int)Marshal.PtrToStructure((IntPtr)pobjdata, typeof(int));                        copyindex += Marshal.SizeOf(typeof(int));                    }                }                GC.Collect();                #endregion                #region 反序列化old                //unsafe                //{                //    fixed (byte* pContext = Data)                //    {                //        BaseNestedParamE info = (BaseNestedParamE)Marshal.PtrToStructure((IntPtr)pContext, typeof(BaseNestedParamE));                //        param_a = info.param_a;                //        param_b = info.param_b;                //        param_c = info.param_c;                //    }                //}                #endregion            }            catch (Exception ex)            {                throw new Exception("BaseNestedParamE反序列化失败", ex);            }        }    }    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]    public class BaseNestedParamF    {        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]        public string param_b;        public byte[] Serialize()        {            try            {                                #region 计算长度                int TotalLength = 0;                TotalLength += 512;  //param_b                #endregion                #region 序列化                byte[] data = new byte[TotalLength];                int copyindex = 0;                unsafe                {                    //param_b                    byte[] param_b_data = Encoding.Unicode.GetBytes(param_b);                    int param_b_data_length = param_b_data.Length > 512 ? 512 : param_b_data.Length;                    Array.Copy(param_b_data, 0, data, copyindex, param_b_data_length);                    param_b_data = null;                    copyindex += 512;                    GC.Collect();                }                #endregion                return data;                #region 序列化old                //byte[] data = new byte[Marshal.SizeOf(typeof(BaseNestedParamF))];                //unsafe                //{                //    fixed (byte* pobjdata = new byte[data.Length])                //    {                //        Marshal.StructureToPtr(this, (IntPtr)pobjdata, true);                //        Marshal.Copy((IntPtr)pobjdata, data, 0, data.Length);                //        return data;                //    }                //}                #endregion            }            catch (Exception ex)            {                throw new Exception("BaseNestedParamF序列化失败", ex);            }        }        public void DeSerialize(byte[] Data)        {            try            {                #region 反序列化                int copyindex = 0;                unsafe                {                    //param_b                    byte[] param_b_data = new byte[512];                    Array.Copy(Data, copyindex, param_b_data, 0, 512);                    param_b = Encoding.Unicode.GetString(param_b_data);                    param_b_data = null;                    copyindex += 512;                }                GC.Collect();                #endregion                #region 反序列化old                //unsafe                //{                //    fixed (byte* pContext = Data)                //    {                //        BaseNestedParamF info = (BaseNestedParamF)Marshal.PtrToStructure((IntPtr)pContext, typeof(BaseNestedParamF));                //        param_a = info.param_a;                //        param_b = info.param_b;                //    }                //}                #endregion            }            catch (Exception ex)            {                throw new Exception("BaseNestedParamF反序列化失败", ex);            }        }    }}

原创粉丝点击