コード例 #1
0
        public int GetSize()
        {
            int size = 0;

            FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);

            foreach (FieldInfo field in fields)
            {
                if (field.FieldType.IsArray)
                {
                    size += GetFieldSize(field);
                }
                else if (field.FieldType == typeof(string))
                {
                    size += GetFieldSize(field) * 2;
                }
                else if (field.FieldType.IsPrimitive)
                {
                    size += Marshal.SizeOf(field.FieldType);
                }
                // This else condition added by JTF, 8/17/04 to handle sizing of structures within structures
                else                 //process substructure
                {
                    AdvancedMarshaler subStruct = (AdvancedMarshaler)Activator.CreateInstance(field.FieldType);
                    size += subStruct.GetSize();
                }
                // End of Modifications
            }

            return(size);
        }
コード例 #2
0
        public virtual void ReadFromStream(BinaryReader reader)
        {
            object[] param = null;

            // Get all public fields
            FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);

            // Loop through the fields
            foreach (FieldInfo field in fields)
            {
                // Retrieve the read method from ReadMethods hashtable
                MethodInfo method = (MethodInfo)MarshallingMethods.ReadMethods[field.FieldType];

                if (field.FieldType.IsArray)
                {
                    Type element = field.FieldType.GetElementType();
                    if (element.IsValueType && element.IsPrimitive)
                    {
                        if ((element == typeof(char)) || element == typeof(byte))
                        {
                            param    = new object[1];
                            param[0] = GetFieldSize(field);
                            field.SetValue(this, method.Invoke(reader, param));
                        }
                        else                         // any other value type array
                        {
                            param    = new object[2];
                            param[0] = reader;

                            int fldSize = 1;
                            if (element == typeof(int))
                            {
                                fldSize = 4;
                            }

                            param[1] = GetFieldSize(field) / fldSize;

                            field.SetValue(this, method.Invoke(null, param));
                        }
                    }
                    else                     // array of sub structures
                    {
                        int size = GetFieldSize(field);
                        method = (MethodInfo)MarshallingMethods.ReadMethods[typeof(AdvancedMarshaler)];
                        Array objArray = Array.CreateInstance(element, size);
                        for (int i = 0; i < size; i++)
                        {
                            objArray.SetValue(Activator.CreateInstance(element), i);
                            method.Invoke(objArray.GetValue(i), new object[] { reader });
                        }
                        field.SetValue(this, objArray);
                    }
                }
                else if (field.FieldType == typeof(string))
                {
                    param    = new object[2];
                    param[0] = reader;
                    param[1] = GetFieldSize(field);
                    field.SetValue(this, method.Invoke(null, param));
                }
                else if (field.FieldType.IsValueType && field.FieldType.IsPrimitive)                // regular value type
                {
                    field.SetValue(this, method.Invoke(reader, null));
                }
                else                 //process substructure
                {
                    // modified by JTF - 08/19/04
                    // code should be using existing instance of a substructure but original code created new
                    // instance.
                    AdvancedMarshaler subStruct = (AdvancedMarshaler)field.GetValue(this);
                    //					AdvancedMarshaler subStruct = (AdvancedMarshaler)Activator.CreateInstance(field.FieldType);
                    subStruct.ReadFromStream(reader);
                }
            }
        }
コード例 #3
0
        public virtual void WriteToStream(BinaryWriter writer)
        {
            object[] param = null;

            FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);

            foreach (FieldInfo field in fields)
            {
                // Check if we have any value
                object value = field.GetValue(this);

                MethodInfo method = (MethodInfo)MarshallingMethods.WriteMethods[field.FieldType];

                if (field.FieldType.IsArray)
                {
                    Type element = field.FieldType.GetElementType();
                    if (element.IsValueType && element.IsPrimitive)
                    {
                        //method.Invoke(writer, new object[] {value});
                        Array arrObject = (Array)field.GetValue(this);
                        param    = new object[2];
                        param[0] = writer;
                        param[1] = arrObject;
                        method.Invoke(null, param);
                    }
                    else
                    {
                        //Get field size
                        int size = GetFieldSize(field);
                        //Get WriteToStream method
                        method = (MethodInfo)MarshallingMethods.WriteMethods[typeof(AdvancedMarshaler)];
                        Array arrObject = (Array)field.GetValue(this);
                        for (int i = 0; i < size; i++)
                        {
                            method.Invoke(arrObject.GetValue(i), new object[] { writer });
                        }
                    }
                }
                else if (field.FieldType == typeof(string))
                {
                    param    = new object[3];
                    param[0] = writer;
                    param[1] = field.GetValue(this);
                    param[2] = GetFieldSize(field);
                    method.Invoke(null, param);
                }
                else if (field.FieldType.IsValueType && field.FieldType.IsPrimitive)                // regular value type
                {
                    method.Invoke(writer, new object[] { value });
                }
                else                 //process substructure
                {
                    // modified by JTF - 08/18/04
                    // original code creates new empty instance of substructure and attempts to write to its
                    // empty "data" byte array
                    AdvancedMarshaler subStruct = (AdvancedMarshaler)value;
                    //					AdvancedMarshaler subStruct = (AdvancedMarshaler)Activator.CreateInstance(field.FieldType);
                    subStruct.WriteToStream(writer);
                }
            }
        }
コード例 #4
0
 public static void WriteSerializers(BinaryWriter writer, AdvancedMarshaler[] arr)
 {
     for (int i = 0; i < arr.Length; i++)
     {
         arr[i].WriteToStream(writer);
     }
 }