Fix
[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
13 namespace System.Runtime.Serialization
14 {
15         public sealed class FormatterServices
16         {
17                 private const BindingFlags fieldFlags = BindingFlags.Public |
18                                                         BindingFlags.Instance |
19                                                         BindingFlags.NonPublic |
20                                                         BindingFlags.DeclaredOnly;
21
22                 private FormatterServices ()
23                 {
24                 }
25
26                 public static object [] GetObjectData (object obj, MemberInfo [] members)
27                 {
28                         if (obj == null)
29                                 throw new ArgumentNullException ("obj");
30
31                         if (members == null)
32                                 throw new ArgumentNullException ("members");
33
34                         int n = members.Length;
35                         object [] result = new object [n];
36                         for (int i = 0; i < n; i++) {
37                                 MemberInfo member = members [i];
38                                 if (member == null)
39                                         throw new ArgumentNullException (String.Format ("members[{0}]", i));
40
41                                 if (member.MemberType != MemberTypes.Field)
42                                         throw new SerializationException (
43                                                         String.Format ("members [{0}] is not a field.", i));
44
45                                 FieldInfo fi = member as FieldInfo; //FIXME: Can fi be null?
46                                 result [i] = fi.GetValue (obj);
47                         }
48
49                         return result;
50                 }
51
52                 public static MemberInfo [] GetSerializableMembers (Type type)
53                 {
54                         StreamingContext st = new StreamingContext (StreamingContextStates.All);
55                         return GetSerializableMembers (type, st);
56                 }
57
58                 public static MemberInfo [] GetSerializableMembers (Type type, StreamingContext context)
59                 {
60                         if (type == null)
61                                 throw new ArgumentNullException ("type");
62
63                         //FIXME: context?
64                         ArrayList fields = new ArrayList ();
65                         Type t = type;
66                         while (t != null) {
67                                 GetFields (t, fields);
68                                 t = t.BaseType;
69                         }
70
71                         MemberInfo [] result = new MemberInfo [fields.Count];
72                         fields.CopyTo (result);
73                         return result;
74                 }
75
76                 private static void GetFields (Type type, ArrayList fields)
77                 {
78                         FieldInfo [] fs = type.GetFields (fieldFlags);
79                         foreach (FieldInfo field in fs)
80                                 if (!(field.IsNotSerialized))
81                                         fields.Add (field);
82                 }
83
84                 public static Type GetTypeFromAssembly (Assembly assem, string name)
85                 {
86                         if (assem == null)
87                                 throw new ArgumentNullException ("assem");
88
89                         if (name == null)
90                                 throw new ArgumentNullException ("name");
91
92                         return assem.GetType (name);
93                 }
94
95                 [MonoTODO]
96                 public static object GetUninitializedObject (Type type)
97                 {
98                         throw new NotImplementedException ();
99                 }
100
101                 public static object PopulateObjectMembers (object obj, MemberInfo [] members, object [] data)
102                 {
103                         if (obj == null)
104                                 throw new ArgumentNullException ("obj");
105
106                         if (members == null)
107                                 throw new ArgumentNullException ("members");
108
109                         if (data == null)
110                                 throw new ArgumentNullException ("data");
111
112                         int length = members.Length;
113                         if (length != data.Length)
114                                 throw new ArgumentException ("different length in members and data");
115
116                         for (int i = 0; i < length; i++) {
117                                 MemberInfo member = members [i];
118                                 if (member == null)
119                                         throw new ArgumentNullException (String.Format ("members[{0}]", i));
120                                         
121                                 if (member.MemberType != MemberTypes.Field)
122                                         throw new SerializationException (
123                                                         String.Format ("members [{0}] is not a field.", i));
124
125                                 FieldInfo fi = member as FieldInfo; //FIXME: can fi be null?
126                                 fi.SetValue (obj, data [i]);
127                         }
128
129                         return obj;
130                 }
131         }
132 }
133