2 // System.Runtime.Serialization.SerializationInfo.cs
5 // Miguel de Icaza (miguel@ximian.com)
6 // Duncan Mak (duncan@ximian.com)
7 // Dietmar Maurer (dietmar@ximian.com)
9 // (C) Ximian, Inc. http://www.ximian.com
14 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
16 // Permission is hereby granted, free of charge, to any person obtaining
17 // a copy of this software and associated documentation files (the
18 // "Software"), to deal in the Software without restriction, including
19 // without limitation the rights to use, copy, modify, merge, publish,
20 // distribute, sublicense, and/or sell copies of the Software, and to
21 // permit persons to whom the Software is furnished to do so, subject to
22 // the following conditions:
24 // The above copyright notice and this permission notice shall be
25 // included in all copies or substantial portions of the Software.
27 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
31 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
32 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
33 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 using System.Collections.Generic;
39 namespace System.Runtime.Serialization
41 [System.Runtime.InteropServices.ComVisibleAttribute (true)]
42 public sealed class SerializationInfo
44 Dictionary<string, SerializationEntry> serialized = new Dictionary<string, SerializationEntry> ();
45 List<SerializationEntry> values = new List<SerializationEntry> ();
47 string assemblyName; // the assembly being serialized
48 string fullTypeName; // the type being serialized.
50 bool isAssemblyNameSetExplicit;
51 bool isFullTypeNameSetExplicit;
53 IFormatterConverter converter;
55 /* used by the runtime */
56 private SerializationInfo (Type type)
58 assemblyName = type.Assembly.FullName;
59 fullTypeName = type.FullName;
60 converter = new FormatterConverter ();
64 /* used by the runtime */
65 private SerializationInfo (Type type, SerializationEntry [] data)
67 int len = data.Length;
69 assemblyName = type.Assembly.FullName;
70 fullTypeName = type.FullName;
71 converter = new FormatterConverter ();
74 for (int i = 0; i < len; i++) {
75 serialized.Add (data [i].Name, data [i]);
76 values.Add (data [i]);
81 [CLSCompliant (false)]
82 public SerializationInfo (Type type, IFormatterConverter converter)
85 throw new ArgumentNullException ("type", "Null argument");
87 if (converter == null)
88 throw new ArgumentNullException ("converter", "Null argument");
90 this.converter = converter;
91 assemblyName = type.Assembly.FullName;
92 fullTypeName = type.FullName;
97 public string AssemblyName
99 get { return assemblyName; }
103 throw new ArgumentNullException ("Argument is null.");
104 assemblyName = value;
105 isAssemblyNameSetExplicit = true;
109 public string FullTypeName
111 get { return fullTypeName; }
115 throw new ArgumentNullException ("Argument is null.");
116 fullTypeName = value;
117 isFullTypeNameSetExplicit = true;
121 public int MemberCount
123 get { return serialized.Count; }
126 public bool IsAssemblyNameSetExplicit {
128 return isAssemblyNameSetExplicit;
132 public bool IsFullTypeNameSetExplicit {
134 return isFullTypeNameSetExplicit;
138 public Type ObjectType {
145 public void AddValue (string name, object value, Type type)
148 throw new ArgumentNullException ("name is null");
150 throw new ArgumentNullException ("type is null");
152 if (serialized.ContainsKey (name))
153 throw new SerializationException ("Value has been serialized already.");
155 SerializationEntry entry = new SerializationEntry (name, type, value);
157 serialized.Add (name, entry);
161 public object GetValue (string name, Type type)
164 throw new ArgumentNullException ("name is null.");
166 throw new ArgumentNullException ("type");
167 if (!serialized.ContainsKey (name))
168 throw new SerializationException ("No element named " + name + " could be found.");
170 SerializationEntry entry = serialized [name];
172 if (entry.Value != null && !type.IsInstanceOfType (entry.Value))
173 return converter.Convert (entry.Value, type);
178 internal bool HasKey (string name)
180 return serialized.ContainsKey (name);
183 public void SetType (Type type)
186 throw new ArgumentNullException ("type is null.");
188 fullTypeName = type.FullName;
189 assemblyName = type.Assembly.FullName;
191 isAssemblyNameSetExplicit = false;
192 isFullTypeNameSetExplicit = false;
195 public SerializationInfoEnumerator GetEnumerator ()
197 return new SerializationInfoEnumerator (values);
200 public void AddValue (string name, short value)
202 AddValue (name, value, typeof (System.Int16));
205 [CLSCompliant(false)]
206 public void AddValue (string name, UInt16 value)
208 AddValue (name, value, typeof (System.UInt16));
211 public void AddValue (string name, int value)
213 AddValue (name, value, typeof (System.Int32));
216 public void AddValue (string name, byte value)
218 AddValue (name, value, typeof (System.Byte));
221 public void AddValue (string name, bool value)
223 AddValue (name, value, typeof (System.Boolean));
226 public void AddValue (string name, char value)
228 AddValue (name, value, typeof (System.Char));
231 [CLSCompliant(false)]
232 public void AddValue (string name, SByte value)
234 AddValue (name, value, typeof (System.SByte));
237 public void AddValue (string name, double value)
239 AddValue (name, value, typeof (System.Double));
242 public void AddValue (string name, Decimal value)
244 AddValue (name, value, typeof (System.Decimal));
247 public void AddValue (string name, DateTime value)
249 AddValue (name, value, typeof (System.DateTime));
252 public void AddValue (string name, float value)
254 AddValue (name, value, typeof (System.Single));
257 [CLSCompliant(false)]
258 public void AddValue (string name, UInt32 value)
260 AddValue (name, value, typeof (System.UInt32));
263 public void AddValue (string name, long value)
265 AddValue (name, value, typeof (System.Int64));
268 [CLSCompliant(false)]
269 public void AddValue (string name, UInt64 value)
271 AddValue (name, value, typeof (System.UInt64));
274 public void AddValue (string name, object value)
277 AddValue (name, value, typeof (System.Object));
279 AddValue (name, value, value.GetType ());
282 public bool GetBoolean (string name)
284 object value = GetValue (name, typeof (System.Boolean));
285 return converter.ToBoolean (value);
288 public byte GetByte (string name)
290 object value = GetValue (name, typeof (System.Byte));
291 return converter.ToByte (value);
294 public char GetChar (string name)
296 object value = GetValue (name, typeof (System.Char));
297 return converter.ToChar (value);
300 public DateTime GetDateTime (string name)
302 object value = GetValue (name, typeof (System.DateTime));
303 return converter.ToDateTime (value);
306 public Decimal GetDecimal (string name)
308 object value = GetValue (name, typeof (System.Decimal));
309 return converter.ToDecimal (value);
312 public double GetDouble (string name)
314 object value = GetValue (name, typeof (System.Double));
315 return converter.ToDouble (value);
318 public short GetInt16 (string name)
320 object value = GetValue (name, typeof (System.Int16));
321 return converter.ToInt16 (value);
324 public int GetInt32 (string name)
326 object value = GetValue (name, typeof (System.Int32));
327 return converter.ToInt32 (value);
330 public long GetInt64 (string name)
332 object value = GetValue (name, typeof (System.Int64));
333 return converter.ToInt64 (value);
336 [CLSCompliant(false)]
337 public SByte GetSByte (string name)
339 object value = GetValue (name, typeof (System.SByte));
340 return converter.ToSByte (value);
343 public float GetSingle (string name)
345 object value = GetValue (name, typeof (System.Single));
346 return converter.ToSingle (value);
349 public string GetString (string name)
351 object value = GetValue (name, typeof (System.String));
352 if (value == null) return null;
353 return converter.ToString (value);
356 [CLSCompliant(false)]
357 public UInt16 GetUInt16 (string name)
359 object value = GetValue (name, typeof (System.UInt16));
360 return converter.ToUInt16 (value);
363 [CLSCompliant(false)]
364 public UInt32 GetUInt32 (string name)
366 object value = GetValue (name, typeof (System.UInt32));
367 return converter.ToUInt32 (value);
369 [CLSCompliant(false)]
370 public UInt64 GetUInt64 (string name)
372 object value = GetValue (name, typeof (System.UInt64));
373 return converter.ToUInt64 (value);
376 /* used by the runtime */
377 #pragma warning disable 169
378 private SerializationEntry [] get_entries ()
380 SerializationEntry [] res = new SerializationEntry [this.MemberCount];
383 foreach (SerializationEntry e in this)
388 #pragma warning restore 169