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; // members must be fields
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 if (!t.IsSerializable) {
69 string msg = String.Format ("Type {0} in assembly {1} is not " +
70 "marked as serializable.",
71 t, t.Assembly.FullName);
73 throw new SerializationException (msg);
76 GetFields (t, fields);
80 MemberInfo [] result = new MemberInfo [fields.Count];
81 fields.CopyTo (result);
85 private static void GetFields (Type type, ArrayList fields)
87 FieldInfo [] fs = type.GetFields (fieldFlags);
88 foreach (FieldInfo field in fs)
89 if (!(field.IsNotSerialized))
93 public static Type GetTypeFromAssembly (Assembly assem, string name)
96 throw new ArgumentNullException ("assem");
99 throw new ArgumentNullException ("name");
101 return assem.GetType (name);
104 public static object GetUninitializedObject (Type type)
107 throw new ArgumentNullException ("type");
109 if (type == typeof (string))
110 throw new ArgumentException ("Uninitialized Strings cannot be created.");
112 return System.Runtime.Remoting.Activation.ActivationServices.AllocateUninitializedClassInstance (type);
115 public static object PopulateObjectMembers (object obj, MemberInfo [] members, object [] data)
118 throw new ArgumentNullException ("obj");
121 throw new ArgumentNullException ("members");
124 throw new ArgumentNullException ("data");
126 int length = members.Length;
127 if (length != data.Length)
128 throw new ArgumentException ("different length in members and data");
130 for (int i = 0; i < length; i++) {
131 MemberInfo member = members [i];
133 throw new ArgumentNullException (String.Format ("members[{0}]", i));
135 if (member.MemberType != MemberTypes.Field)
136 throw new SerializationException (
137 String.Format ("members [{0}] is not a field.", i));
139 FieldInfo fi = member as FieldInfo; // members must be fields
140 fi.SetValue (obj, data [i]);