2003-11-18 Andreas Nahr <ClassDevelopment@A-SoftTech.com>
[mono.git] / mcs / class / corlib / System.Runtime.Serialization / FormatterServices.cs
1 //
2 // System.Runtime.Serialization.FormatterServices
3 //
4 // Authors:
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 // (C) 2002 Ximian, Inc (http://www.ximian.com)
8 //
9 using System;
10 using System.Collections;
11 using System.Reflection;
12 using System.Runtime.CompilerServices;
13
14 namespace System.Runtime.Serialization
15 {
16         public sealed class FormatterServices
17         {
18                 private const BindingFlags fieldFlags = BindingFlags.Public |
19                                                         BindingFlags.Instance |
20                                                         BindingFlags.NonPublic |
21                                                         BindingFlags.DeclaredOnly;
22
23                 private FormatterServices ()
24                 {
25                 }
26
27                 public static object [] GetObjectData (object obj, MemberInfo [] members)
28                 {
29                         if (obj == null)
30                                 throw new ArgumentNullException ("obj");
31
32                         if (members == null)
33                                 throw new ArgumentNullException ("members");
34
35                         int n = members.Length;
36                         object [] result = new object [n];
37                         for (int i = 0; i < n; i++) {
38                                 MemberInfo member = members [i];
39                                 if (member == null)
40                                         throw new ArgumentNullException (String.Format ("members[{0}]", i));
41
42                                 if (member.MemberType != MemberTypes.Field)
43                                         throw new SerializationException (
44                                                         String.Format ("members [{0}] is not a field.", i));
45
46                                 FieldInfo fi = member as FieldInfo; // members must be fields
47                                 result [i] = fi.GetValue (obj);
48                         }
49
50                         return result;
51                 }
52
53                 public static MemberInfo [] GetSerializableMembers (Type type)
54                 {
55                         StreamingContext st = new StreamingContext (StreamingContextStates.All);
56                         return GetSerializableMembers (type, st);
57                 }
58
59                 public static MemberInfo [] GetSerializableMembers (Type type, StreamingContext context)
60                 {
61                         if (type == null)
62                                 throw new ArgumentNullException ("type");
63
64                         //FIXME: context?
65                         ArrayList fields = new ArrayList ();
66                         Type t = type;
67                         while (t != null) {
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);
72
73                                         throw new SerializationException (msg);
74                                 }
75
76                                 GetFields (t, fields);
77                                 t = t.BaseType;
78                         }
79
80                         MemberInfo [] result = new MemberInfo [fields.Count];
81                         fields.CopyTo (result);
82                         return result;
83                 }
84
85                 private static void GetFields (Type type, ArrayList fields)
86                 {
87                         FieldInfo [] fs = type.GetFields (fieldFlags);
88                         foreach (FieldInfo field in fs)
89                                 if (!(field.IsNotSerialized))
90                                         fields.Add (field);
91                 }
92
93                 public static Type GetTypeFromAssembly (Assembly assem, string name)
94                 {
95                         if (assem == null)
96                                 throw new ArgumentNullException ("assem");
97
98                         if (name == null)
99                                 throw new ArgumentNullException ("name");
100
101                         return assem.GetType (name);
102                 }
103
104                 public static object GetUninitializedObject (Type type)
105                 {
106                         if (type == null)
107                                 throw new ArgumentNullException ("type");
108
109                         if (type == typeof (string))
110                                 throw new ArgumentException ("Uninitialized Strings cannot be created.");
111
112                         return System.Runtime.Remoting.Activation.ActivationServices.AllocateUninitializedClassInstance (type);
113                 }
114
115                 public static object PopulateObjectMembers (object obj, MemberInfo [] members, object [] data)
116                 {
117                         if (obj == null)
118                                 throw new ArgumentNullException ("obj");
119
120                         if (members == null)
121                                 throw new ArgumentNullException ("members");
122
123                         if (data == null)
124                                 throw new ArgumentNullException ("data");
125
126                         int length = members.Length;
127                         if (length != data.Length)
128                                 throw new ArgumentException ("different length in members and data");
129
130                         for (int i = 0; i < length; i++) {
131                                 MemberInfo member = members [i];
132                                 if (member == null)
133                                         throw new ArgumentNullException (String.Format ("members[{0}]", i));
134                                         
135                                 if (member.MemberType != MemberTypes.Field)
136                                         throw new SerializationException (
137                                                         String.Format ("members [{0}] is not a field.", i));
138
139                                 FieldInfo fi = member as FieldInfo; // members must be fields
140                                 fi.SetValue (obj, data [i]);
141                         }
142
143                         return obj;
144                 }
145         }
146 }