2 // System.Runtime.Serialization.SurrogateSelector.cs
4 // Author: Duncan Mak (duncan@ximian.com)
10 using System.Collections;
12 namespace System.Runtime.Serialization
14 public class SurrogateSelector : ISurrogateSelector
17 Hashtable Surrogates = new Hashtable ();
18 string currentKey = null; // current key of Surrogates
20 internal struct Bundle
22 public ISerializationSurrogate surrogate;
23 public ArrayList selectors;
25 public Bundle (ISerializationSurrogate surrogate)
27 this.surrogate = surrogate;
28 selectors = new ArrayList ();
33 public SurrogateSelector()
39 public virtual void AddSurrogate (Type type,
40 StreamingContext context, ISerializationSurrogate surrogate)
42 if (type == null || surrogate == null)
43 throw new ArgumentNullException ("Null reference.");
45 currentKey = type.FullName + "#" + context.ToString ();
47 if (Surrogates.ContainsKey (currentKey))
48 throw new ArgumentException ("A surrogate for " + type.FullName + " already exists.");
50 Bundle values = new Bundle (surrogate);
52 Surrogates.Add (currentKey, values);
55 public virtual void ChainSelector (ISurrogateSelector selector)
58 throw new ArgumentNullException ("Selector is null.");
60 Bundle current = (Bundle) Surrogates [currentKey];
61 current.selectors.Add (selector);
64 public virtual ISurrogateSelector GetNextSelector ()
66 Bundle current = (Bundle) Surrogates [currentKey];
67 return (ISurrogateSelector) current.selectors [current.selectors.Count];
70 public virtual ISerializationSurrogate GetSurrogate (Type type,
71 StreamingContext context, out ISurrogateSelector selector)
74 throw new ArgumentNullException ("type is null.");
76 string key = type.FullName + "#" + context.ToString ();
77 Bundle current = (Bundle) Surrogates [key];
78 selector = (ISurrogateSelector) current.selectors [current.selectors.Count - 1];
80 return (ISerializationSurrogate) current.surrogate;
83 public virtual void RemoveSurrogate (Type type, StreamingContext context)
86 throw new ArgumentNullException ("type is null.");
88 string key = type.FullName + "#" + context.ToString ();
89 Surrogates.Remove (key);