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 using System.Collections;
16 namespace System.Runtime.Serialization
18 public sealed class SerializationInfo
20 Hashtable serialized = new Hashtable ();
21 string assemblyName; // the assembly being serialized
22 string fullTypeName; // the type being serialized.
24 IFormatterConverter converter;
26 /* used by the runtime */
27 private SerializationInfo (Type type)
29 assemblyName = type.Assembly.FullName;
30 fullTypeName = type.FullName;
31 converter = new FormatterConverter ();
34 /* used by the runtime */
35 private SerializationInfo (Type type, SerializationEntry [] data)
37 int len = data.Length;
39 assemblyName = type.Assembly.FullName;
40 fullTypeName = type.FullName;
41 converter = new FormatterConverter ();
43 for (int i = 0; i < len; i++)
44 serialized.Add (data [i].Name, data [i]);
48 [CLSCompliant (false)]
49 public SerializationInfo (Type type, IFormatterConverter converter)
51 if (type == null && converter == null)
52 throw new ArgumentNullException ("Null arguments.");
54 this.converter = converter;
55 assemblyName = type.Assembly.FullName;
56 fullTypeName = type.FullName;
60 public string AssemblyName
62 get { return assemblyName; }
66 throw new ArgumentNullException ("Argument is null.");
71 public string FullTypeName
73 get { return fullTypeName; }
77 throw new ArgumentNullException ("Argument is null.");
82 public int MemberCount
84 get { return serialized.Count; }
88 public void AddValue (string name, object value, Type type)
90 if (serialized.ContainsKey (name))
91 throw new SerializationException ("Value has been serialized already.");
93 SerializationEntry values = new SerializationEntry (name, type, value);
94 serialized.Add (name, values);
97 public object GetValue (string name, Type type)
100 throw new ArgumentNullException ("name is null.");
102 throw new ArgumentNullException ("type");
103 if (!serialized.ContainsKey (name))
104 throw new SerializationException ("No element named " + name + " could be found.");
106 SerializationEntry values = (SerializationEntry) serialized [name];
108 if (values.Value != null && !type.IsAssignableFrom (values.Value.GetType()))
109 return converter.Convert (values.Value, type);
114 public void SetType (Type type)
117 throw new ArgumentNullException ("type is null.");
119 fullTypeName = type.FullName;
120 assemblyName = type.Assembly.FullName;
123 public SerializationInfoEnumerator GetEnumerator ()
125 return new SerializationInfoEnumerator (serialized);
128 public void AddValue (string name, short value)
130 AddValue (name, value, typeof (System.Int16));
133 [CLSCompliant(false)]
134 public void AddValue (string name, UInt16 value)
136 AddValue (name, value, typeof (System.UInt16));
139 public void AddValue (string name, int value)
141 AddValue (name, value, typeof (System.Int32));
144 public void AddValue (string name, byte value)
146 AddValue (name, value, typeof (System.Byte));
149 public void AddValue (string name, bool value)
151 AddValue (name, value, typeof (System.Boolean));
154 public void AddValue (string name, char value)
156 AddValue (name, value, typeof (System.Char));
159 [CLSCompliant(false)]
160 public void AddValue (string name, SByte value)
162 AddValue (name, value, typeof (System.SByte));
165 public void AddValue (string name, double value)
167 AddValue (name, value, typeof (System.Double));
170 public void AddValue (string name, Decimal value)
172 AddValue (name, value, typeof (System.Decimal));
175 public void AddValue (string name, DateTime value)
177 AddValue (name, value, typeof (System.DateTime));
180 public void AddValue (string name, float value)
182 AddValue (name, value, typeof (System.Single));
185 [CLSCompliant(false)]
186 public void AddValue (string name, UInt32 value)
188 AddValue (name, value, typeof (System.UInt32));
191 public void AddValue (string name, long value)
193 AddValue (name, value, typeof (System.Int64));
196 [CLSCompliant(false)]
197 public void AddValue (string name, UInt64 value)
199 AddValue (name, value, typeof (System.UInt64));
202 public void AddValue (string name, object value)
205 AddValue (name, value, typeof (System.Object));
207 AddValue (name, value, value.GetType ());
210 public bool GetBoolean (string name)
212 object value = GetValue (name, typeof (System.Boolean));
213 return converter.ToBoolean (value);
216 public byte GetByte (string name)
218 object value = GetValue (name, typeof (System.Byte));
219 return converter.ToByte (value);
222 public char GetChar (string name)
224 object value = GetValue (name, typeof (System.Char));
225 return converter.ToChar (value);
228 public DateTime GetDateTime (string name)
230 object value = GetValue (name, typeof (System.DateTime));
231 return converter.ToDateTime (value);
234 public Decimal GetDecimal (string name)
236 object value = GetValue (name, typeof (System.Decimal));
237 return converter.ToDecimal (value);
240 public double GetDouble (string name)
242 object value = GetValue (name, typeof (System.Double));
243 return converter.ToDouble (value);
246 public short GetInt16 (string name)
248 object value = GetValue (name, typeof (System.Int16));
249 return converter.ToInt16 (value);
252 public int GetInt32 (string name)
254 object value = GetValue (name, typeof (System.Int32));
255 return converter.ToInt32 (value);
258 public long GetInt64 (string name)
260 object value = GetValue (name, typeof (System.Int64));
261 return converter.ToInt64 (value);
264 [CLSCompliant(false)]
265 public SByte GetSByte (string name)
267 object value = GetValue (name, typeof (System.SByte));
268 return converter.ToSByte (value);
271 public float GetSingle (string name)
273 object value = GetValue (name, typeof (System.Single));
274 return converter.ToSingle (value);
277 public string GetString (string name)
279 object value = GetValue (name, typeof (System.String));
280 if (value == null) return null;
281 return converter.ToString (value);
284 [CLSCompliant(false)]
285 public UInt16 GetUInt16 (string name)
287 object value = GetValue (name, typeof (System.UInt16));
288 return converter.ToUInt16 (value);
291 [CLSCompliant(false)]
292 public UInt32 GetUInt32 (string name)
294 object value = GetValue (name, typeof (System.UInt32));
295 return converter.ToUInt32 (value);
297 [CLSCompliant(false)]
298 public UInt64 GetUInt64 (string name)
300 object value = GetValue (name, typeof (System.UInt64));
301 return converter.ToUInt64 (value);
304 /* used by the runtime */
305 private SerializationEntry [] get_entries ()
307 SerializationEntry [] res = new SerializationEntry [this.MemberCount];
310 foreach (SerializationEntry e in this)