2 // System.Runtime.Serialization.FormatterServices
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // (C) 2002 Ximian, Inc (http://www.ximian.com)
10 using System.Collections;
11 using System.Reflection;
12 using System.Runtime.CompilerServices;
14 namespace System.Runtime.Serialization
16 public sealed class FormatterServices
18 private const BindingFlags fieldFlags = BindingFlags.Public |
19 BindingFlags.Instance |
20 BindingFlags.NonPublic |
21 BindingFlags.DeclaredOnly;
23 private FormatterServices ()
27 public static object [] GetObjectData (object obj, MemberInfo [] members)
30 throw new ArgumentNullException ("obj");
33 throw new ArgumentNullException ("members");
35 int n = members.Length;
36 object [] result = new object [n];
37 for (int i = 0; i < n; i++) {
38 MemberInfo member = members [i];
40 throw new ArgumentNullException (String.Format ("members[{0}]", i));
42 if (member.MemberType != MemberTypes.Field)
43 throw new SerializationException (
44 String.Format ("members [{0}] is not a field.", i));
46 FieldInfo fi = member as FieldInfo; //FIXME: Can fi be null?
47 result [i] = fi.GetValue (obj);
53 public static MemberInfo [] GetSerializableMembers (Type type)
55 StreamingContext st = new StreamingContext (StreamingContextStates.All);
56 return GetSerializableMembers (type, st);
59 public static MemberInfo [] GetSerializableMembers (Type type, StreamingContext context)
62 throw new ArgumentNullException ("type");
65 ArrayList fields = new ArrayList ();
68 GetFields (t, fields);
72 MemberInfo [] result = new MemberInfo [fields.Count];
73 fields.CopyTo (result);
77 private static void GetFields (Type type, ArrayList fields)
79 FieldInfo [] fs = type.GetFields (fieldFlags);
80 foreach (FieldInfo field in fs)
81 if (!(field.IsNotSerialized))
85 public static Type GetTypeFromAssembly (Assembly assem, string name)
88 throw new ArgumentNullException ("assem");
91 throw new ArgumentNullException ("name");
93 return assem.GetType (name);
96 [MethodImplAttribute(MethodImplOptions.InternalCall)]
97 private static extern object GetUninitializedObjectInternal (Type type);
99 public static object GetUninitializedObject (Type type)
102 throw new ArgumentNullException ("type");
104 if (type == typeof (string))
105 throw new ArgumentException ("Uninitialized Strings cannot be created.");
107 return GetUninitializedObjectInternal (type);
110 public static object PopulateObjectMembers (object obj, MemberInfo [] members, object [] data)
113 throw new ArgumentNullException ("obj");
116 throw new ArgumentNullException ("members");
119 throw new ArgumentNullException ("data");
121 int length = members.Length;
122 if (length != data.Length)
123 throw new ArgumentException ("different length in members and data");
125 for (int i = 0; i < length; i++) {
126 MemberInfo member = members [i];
128 throw new ArgumentNullException (String.Format ("members[{0}]", i));
130 if (member.MemberType != MemberTypes.Field)
131 throw new SerializationException (
132 String.Format ("members [{0}] is not a field.", i));
134 FieldInfo fi = member as FieldInfo; //FIXME: can fi be null?
135 fi.SetValue (obj, data [i]);