2 // System.Runtime.Serialization.FormatterServices
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // (C) 2002 Ximian, Inc (http://www.ximian.com)
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System
.Collections
;
34 using System
.Reflection
;
35 using System
.Runtime
.CompilerServices
;
36 using System
.Runtime
.Serialization
.Formatters
;
37 using System
.Globalization
;
39 namespace System
.Runtime
.Serialization
42 [System
.Runtime
.InteropServices
.ComVisibleAttribute (true)]
44 public sealed class FormatterServices
46 private const BindingFlags fieldFlags
= BindingFlags
.Public
|
47 BindingFlags
.Instance
|
48 BindingFlags
.NonPublic
|
49 BindingFlags
.DeclaredOnly
;
51 private FormatterServices ()
55 public static object [] GetObjectData (object obj
, MemberInfo
[] members
)
58 throw new ArgumentNullException ("obj");
61 throw new ArgumentNullException ("members");
63 int n
= members
.Length
;
64 object [] result
= new object [n
];
65 for (int i
= 0; i
< n
; i
++) {
66 MemberInfo member
= members
[i
];
68 throw new ArgumentNullException (String
.Format ("members[{0}]", i
));
70 if (member
.MemberType
!= MemberTypes
.Field
)
71 throw new SerializationException (
72 String
.Format ("members [{0}] is not a field.", i
));
74 FieldInfo fi
= member
as FieldInfo
; // members must be fields
75 result
[i
] = fi
.GetValue (obj
);
81 public static MemberInfo
[] GetSerializableMembers (Type type
)
83 StreamingContext st
= new StreamingContext (StreamingContextStates
.All
);
84 return GetSerializableMembers (type
, st
);
87 public static MemberInfo
[] GetSerializableMembers (Type type
, StreamingContext context
)
90 throw new ArgumentNullException ("type");
93 ArrayList fields
= new ArrayList ();
96 if (!t
.IsSerializable
) {
97 string msg
= String
.Format ("Type {0} in assembly {1} is not " +
98 "marked as serializable.",
99 t
, t
.Assembly
.FullName
);
101 throw new SerializationException (msg
);
104 GetFields (type
, t
, fields
);
108 MemberInfo
[] result
= new MemberInfo
[fields
.Count
];
109 fields
.CopyTo (result
);
113 private static void GetFields (Type reflectedType
, Type type
, ArrayList fields
)
115 FieldInfo
[] fs
= type
.GetFields (fieldFlags
);
116 foreach (FieldInfo field
in fs
)
117 if (!(field
.IsNotSerialized
)) {
118 MonoField mf
= field
as MonoField
;
119 if (mf
!= null && reflectedType
!= type
&& !mf
.IsPublic
) {
120 string fname
= type
.Name
+ "+" + mf
.Name
;
121 fields
.Add (mf
.Clone (fname
));
128 public static Type
GetTypeFromAssembly (Assembly assem
, string name
)
131 throw new ArgumentNullException ("assem");
134 throw new ArgumentNullException ("name");
136 return assem
.GetType (name
);
139 public static object GetUninitializedObject (Type type
)
142 throw new ArgumentNullException ("type");
144 if (type
== typeof (string))
145 throw new ArgumentException ("Uninitialized Strings cannot be created.");
147 return System
.Runtime
.Remoting
.Activation
.ActivationServices
.AllocateUninitializedClassInstance (type
);
150 public static object PopulateObjectMembers (object obj
, MemberInfo
[] members
, object [] data
)
153 throw new ArgumentNullException ("obj");
156 throw new ArgumentNullException ("members");
159 throw new ArgumentNullException ("data");
161 int length
= members
.Length
;
162 if (length
!= data
.Length
)
163 throw new ArgumentException ("different length in members and data");
165 for (int i
= 0; i
< length
; i
++) {
166 MemberInfo member
= members
[i
];
168 throw new ArgumentNullException (String
.Format ("members[{0}]", i
));
170 if (member
.MemberType
!= MemberTypes
.Field
)
171 throw new SerializationException (
172 String
.Format ("members [{0}] is not a field.", i
));
174 FieldInfo fi
= member
as FieldInfo
; // members must be fields
175 fi
.SetValue (obj
, data
[i
]);
183 public static void CheckTypeSecurity (Type t
, TypeFilterLevel securityLevel
)
185 if (securityLevel
== TypeFilterLevel
.Full
) return;
186 CheckNotAssignable (typeof(System
.DelegateSerializationHolder
), t
);
187 CheckNotAssignable (typeof(System
.Runtime
.Remoting
.Lifetime
.ISponsor
), t
);
188 CheckNotAssignable (typeof(System
.Runtime
.Remoting
.IEnvoyInfo
), t
);
189 CheckNotAssignable (typeof(System
.Runtime
.Remoting
.ObjRef
), t
);
192 static void CheckNotAssignable (Type basetype
, Type type
)
194 if (basetype
.IsAssignableFrom (type
)) {
195 string msg
= "Type " + basetype
+ " and the types derived from it";
196 msg
+= " (such as " + type
+ ") are not permitted to be deserialized at this security level";
197 throw new System
.Security
.SecurityException (msg
);
201 public static object GetSafeUninitializedObject (Type type
)
203 // FIXME: MS.NET uses code access permissions to check if the caller is
204 // allowed to create an instance of this type. We can't support this
205 // because it is not implemented in mono.
207 // In concrete, the it will request a SecurityPermission of
208 // type "Infrastructure".
210 return GetUninitializedObject (type
);