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.
51 bool isAssemblyNameSetExplicit;
52 bool isFullTypeNameSetExplicit;
55 IFormatterConverter converter;
57 /* used by the runtime */
58 private SerializationInfo (Type type)
60 assemblyName = type.Assembly.FullName;
61 fullTypeName = type.FullName;
62 converter = new FormatterConverter ();
68 /* used by the runtime */
69 private SerializationInfo (Type type, SerializationEntry [] data)
71 int len = data.Length;
73 assemblyName = type.Assembly.FullName;
74 fullTypeName = type.FullName;
75 converter = new FormatterConverter ();
80 for (int i = 0; i < len; i++) {
81 serialized.Add (data [i].Name, data [i]);
82 values.Add (data [i]);
87 [CLSCompliant (false)]
88 public SerializationInfo (Type type, IFormatterConverter converter)
91 throw new ArgumentNullException ("type", "Null argument");
93 if (converter == null)
94 throw new ArgumentNullException ("converter", "Null argument");
96 this.converter = converter;
97 assemblyName = type.Assembly.FullName;
98 fullTypeName = type.FullName;
105 public string AssemblyName
107 get { return assemblyName; }
111 throw new ArgumentNullException ("Argument is null.");
112 assemblyName = value;
114 isAssemblyNameSetExplicit = true;
119 public string FullTypeName
121 get { return fullTypeName; }
125 throw new ArgumentNullException ("Argument is null.");
126 fullTypeName = value;
128 isFullTypeNameSetExplicit = true;
133 public int MemberCount
135 get { return serialized.Count; }
139 public bool IsAssemblyNameSetExplicit {
141 return isAssemblyNameSetExplicit;
145 public bool IsFullTypeNameSetExplicit {
147 return isFullTypeNameSetExplicit;
151 public Type ObjectType {
159 public void AddValue (string name, object value, Type type)
162 throw new ArgumentNullException ("name is null");
164 throw new ArgumentNullException ("type is null");
166 if (serialized.ContainsKey (name))
167 throw new SerializationException ("Value has been serialized already.");
169 SerializationEntry entry = new SerializationEntry (name, type, value);
171 serialized.Add (name, entry);
175 public object GetValue (string name, Type type)
178 throw new ArgumentNullException ("name is null.");
180 throw new ArgumentNullException ("type");
181 if (!serialized.ContainsKey (name))
182 throw new SerializationException ("No element named " + name + " could be found.");
184 SerializationEntry entry = serialized [name];
186 if (entry.Value != null && !type.IsInstanceOfType (entry.Value))
187 return converter.Convert (entry.Value, type);
192 internal bool HasKey (string name)
194 return serialized.ContainsKey (name);
197 public void SetType (Type type)
200 throw new ArgumentNullException ("type is null.");
202 fullTypeName = type.FullName;
203 assemblyName = type.Assembly.FullName;
206 isAssemblyNameSetExplicit = false;
207 isFullTypeNameSetExplicit = false;
211 public SerializationInfoEnumerator GetEnumerator ()
213 return new SerializationInfoEnumerator (values);
216 public void AddValue (string name, short value)
218 AddValue (name, value, typeof (System.Int16));
221 [CLSCompliant(false)]
222 public void AddValue (string name, UInt16 value)
224 AddValue (name, value, typeof (System.UInt16));
227 public void AddValue (string name, int value)
229 AddValue (name, value, typeof (System.Int32));
232 public void AddValue (string name, byte value)
234 AddValue (name, value, typeof (System.Byte));
237 public void AddValue (string name, bool value)
239 AddValue (name, value, typeof (System.Boolean));
242 public void AddValue (string name, char value)
244 AddValue (name, value, typeof (System.Char));
247 [CLSCompliant(false)]
248 public void AddValue (string name, SByte value)
250 AddValue (name, value, typeof (System.SByte));
253 public void AddValue (string name, double value)
255 AddValue (name, value, typeof (System.Double));
258 public void AddValue (string name, Decimal value)
260 AddValue (name, value, typeof (System.Decimal));
263 public void AddValue (string name, DateTime value)
265 AddValue (name, value, typeof (System.DateTime));
268 public void AddValue (string name, float value)
270 AddValue (name, value, typeof (System.Single));
273 [CLSCompliant(false)]
274 public void AddValue (string name, UInt32 value)
276 AddValue (name, value, typeof (System.UInt32));
279 public void AddValue (string name, long value)
281 AddValue (name, value, typeof (System.Int64));
284 [CLSCompliant(false)]
285 public void AddValue (string name, UInt64 value)
287 AddValue (name, value, typeof (System.UInt64));
290 public void AddValue (string name, object value)
293 AddValue (name, value, typeof (System.Object));
295 AddValue (name, value, value.GetType ());
298 public bool GetBoolean (string name)
300 object value = GetValue (name, typeof (System.Boolean));
301 return converter.ToBoolean (value);
304 public byte GetByte (string name)
306 object value = GetValue (name, typeof (System.Byte));
307 return converter.ToByte (value);
310 public char GetChar (string name)
312 object value = GetValue (name, typeof (System.Char));
313 return converter.ToChar (value);
316 public DateTime GetDateTime (string name)
318 object value = GetValue (name, typeof (System.DateTime));
319 return converter.ToDateTime (value);
322 public Decimal GetDecimal (string name)
324 object value = GetValue (name, typeof (System.Decimal));
325 return converter.ToDecimal (value);
328 public double GetDouble (string name)
330 object value = GetValue (name, typeof (System.Double));
331 return converter.ToDouble (value);
334 public short GetInt16 (string name)
336 object value = GetValue (name, typeof (System.Int16));
337 return converter.ToInt16 (value);
340 public int GetInt32 (string name)
342 object value = GetValue (name, typeof (System.Int32));
343 return converter.ToInt32 (value);
346 public long GetInt64 (string name)
348 object value = GetValue (name, typeof (System.Int64));
349 return converter.ToInt64 (value);
352 [CLSCompliant(false)]
353 public SByte GetSByte (string name)
355 object value = GetValue (name, typeof (System.SByte));
356 return converter.ToSByte (value);
359 public float GetSingle (string name)
361 object value = GetValue (name, typeof (System.Single));
362 return converter.ToSingle (value);
365 public string GetString (string name)
367 object value = GetValue (name, typeof (System.String));
368 if (value == null) return null;
369 return converter.ToString (value);
372 [CLSCompliant(false)]
373 public UInt16 GetUInt16 (string name)
375 object value = GetValue (name, typeof (System.UInt16));
376 return converter.ToUInt16 (value);
379 [CLSCompliant(false)]
380 public UInt32 GetUInt32 (string name)
382 object value = GetValue (name, typeof (System.UInt32));
383 return converter.ToUInt32 (value);
385 [CLSCompliant(false)]
386 public UInt64 GetUInt64 (string name)
388 object value = GetValue (name, typeof (System.UInt64));
389 return converter.ToUInt64 (value);
392 /* used by the runtime */
393 #pragma warning disable 169
394 private SerializationEntry [] get_entries ()
396 SerializationEntry [] res = new SerializationEntry [this.MemberCount];
399 foreach (SerializationEntry e in this)
404 #pragma warning restore 169