Tue Sep 10 12:12:51 CEST 2002 Paolo Molaro <lupus@ximian.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; //FIXME: Can fi be null?
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                                 GetFields (t, fields);
69                                 t = t.BaseType;
70                         }
71
72                         MemberInfo [] result = new MemberInfo [fields.Count];
73                         fields.CopyTo (result);
74                         return result;
75                 }
76
77                 private static void GetFields (Type type, ArrayList fields)
78                 {
79                         FieldInfo [] fs = type.GetFields (fieldFlags);
80                         foreach (FieldInfo field in fs)
81                                 if (!(field.IsNotSerialized))
82                                         fields.Add (field);
83                 }
84
85                 public static Type GetTypeFromAssembly (Assembly assem, string name)
86                 {
87                         if (assem == null)
88                                 throw new ArgumentNullException ("assem");
89
90                         if (name == null)
91                                 throw new ArgumentNullException ("name");
92
93                         return assem.GetType (name);
94                 }
95
96                 [MethodImplAttribute(MethodImplOptions.InternalCall)]
97                 private static extern object GetUninitializedObjectInternal (Type type);
98
99                 public static object GetUninitializedObject (Type type)
100                 {
101                         if (type == null)
102                                 throw new ArgumentNullException ("type");
103
104                         if (type == typeof (string))
105                                 throw new ArgumentException ("Uninitialized Strings cannot be created.");
106
107                         return GetUninitializedObjectInternal (type);
108                 }
109
110                 public static object PopulateObjectMembers (object obj, MemberInfo [] members, object [] data)
111                 {
112                         if (obj == null)
113                                 throw new ArgumentNullException ("obj");
114
115                         if (members == null)
116                                 throw new ArgumentNullException ("members");
117
118                         if (data == null)
119                                 throw new ArgumentNullException ("data");
120
121                         int length = members.Length;
122                         if (length != data.Length)
123                                 throw new ArgumentException ("different length in members and data");
124
125                         for (int i = 0; i < length; i++) {
126                                 MemberInfo member = members [i];
127                                 if (member == null)
128                                         throw new ArgumentNullException (String.Format ("members[{0}]", i));
129                                         
130                                 if (member.MemberType != MemberTypes.Field)
131                                         throw new SerializationException (
132                                                         String.Format ("members [{0}] is not a field.", i));
133
134                                 FieldInfo fi = member as FieldInfo; //FIXME: can fi be null?
135                                 fi.SetValue (obj, data [i]);
136                         }
137
138                         return obj;
139                 }
140         }
141 }
142