| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877 |
- //
- // System.Web.UI.ObjectStateFormatter
- //
- // Authors:
- // Ben Maurer ([email protected])
- // Gonzalo Paniagua ([email protected])
- //
- // (C) 2003 Ben Maurer
- // (c) Copyright 2004 Novell, Inc. (http://www.novell.com)
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- //#define TRACE
- using System.Collections;
- using System.ComponentModel;
- using System.Globalization;
- using System.Drawing;
- using System.IO;
- using System.Reflection;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Runtime.Serialization;
- using System.Text;
- using System.Web.UI.WebControls;
- using System.Web.Util;
- using System.Diagnostics;
- namespace System.Web.UI {
- #if NET_2_0
- public
- #else
- internal
- #endif
- sealed class ObjectStateFormatter : IFormatter {
- public object Deserialize (Stream inputStream)
- {
- if (inputStream == null)
- throw new ArgumentNullException ("inputStream");
- return DeserializeObject (new BinaryReader (inputStream));
- }
-
- public object Deserialize (string inputString)
- {
- if (inputString == null)
- throw new ArgumentNullException ("inputString");
- if (inputString == "")
- return null;
- return Deserialize (new MemoryStream (Convert.FromBase64String (inputString)));
- }
-
- public string Serialize (object stateGraph)
- {
- if (stateGraph == null)
- return "";
-
- MemoryStream ms = new MemoryStream ();
- Serialize (ms, stateGraph);
-
- #if TRACE
- ms.WriteTo (File.OpenWrite (Path.GetTempFileName ()));
- #endif
-
- return Convert.ToBase64String (ms.GetBuffer (), 0, (int) ms.Length);
- }
-
- public void Serialize (Stream outputStream, object stateGraph)
- {
- if (outputStream == null)
- throw new ArgumentNullException ("outputStream");
- if (stateGraph == null)
- throw new ArgumentNullException ("stateGraph");
- SerializeValue (new BinaryWriter (outputStream), stateGraph);
- }
-
- void SerializeValue (BinaryWriter w, object o)
- {
- ObjectFormatter.WriteObject (w, o, new WriterContext ());
- }
-
- object DeserializeObject (BinaryReader r)
- {
- return ObjectFormatter.ReadObject (r, new ReaderContext ());
- }
-
- #region IFormatter
-
- object IFormatter.Deserialize (Stream serializationStream)
- {
- return Deserialize (serializationStream);
- }
-
- void IFormatter.Serialize (Stream serializationStream, object stateGraph)
- {
- Serialize (serializationStream, stateGraph);
- }
-
- SerializationBinder IFormatter.Binder {
- get { return null; }
- set { }
- }
-
- StreamingContext IFormatter.Context {
- get { return new StreamingContext (StreamingContextStates.All); }
- set { }
- }
-
- ISurrogateSelector IFormatter.SurrogateSelector {
- get { return null; }
- set { }
- }
-
- #endregion
- #region Object Readers/Writers
-
- class WriterContext {
- Hashtable cache;
- short nextKey = 0;
-
- public bool RegisterCache (object o, out short key)
- {
- if (cache == null) {
- cache = new Hashtable ();
- cache.Add (o, key = nextKey++);
- return false;
- }
-
- object posKey = cache [o];
- if (posKey == null) {
- cache.Add (o, key = nextKey++);
- return false;
- }
-
- key = (short) posKey;
- return true;
- }
- }
-
- class ReaderContext {
- ArrayList cache;
-
- public void CacheItem (object o)
- {
- if (cache == null)
- cache = new ArrayList ();
-
- cache.Add (o);
- }
-
- public object GetCache (short key)
- {
- return cache [key];
- }
- }
-
- abstract class ObjectFormatter {
- static readonly Hashtable writeMap = new Hashtable ();
- static ObjectFormatter [] readMap = new ObjectFormatter [256];
- static BinaryObjectFormatter binaryObjectFormatter;
- static TypeFormatter typeFormatter;
- static EnumFormatter enumFormatter;
- static SingleRankArrayFormatter singleRankArrayFormatter;
- static TypeConverterFormatter typeConverterFormatter;
-
- static ObjectFormatter ()
- {
- new StringFormatter ().Register ();
- new Int64Formatter ().Register ();
- new Int32Formatter ().Register ();
- new Int16Formatter ().Register ();
- new ByteFormatter ().Register ();
- new BooleanFormatter ().Register ();
- new CharFormatter ().Register ();
- new DateTimeFormatter ().Register ();
- new PairFormatter ().Register ();
- new TripletFormatter ().Register ();
- new ArrayListFormatter ().Register ();
- new HashtableFormatter ().Register ();
- new ObjectArrayFormatter ().Register ();
- new UnitFormatter ().Register ();
- new FontUnitFormatter ().Register ();
-
- new ColorFormatter ().Register ();
- enumFormatter = new EnumFormatter ();
- enumFormatter.Register ();
- typeFormatter = new TypeFormatter ();
- typeFormatter.Register ();
- singleRankArrayFormatter = new SingleRankArrayFormatter ();
- singleRankArrayFormatter.Register ();
- typeConverterFormatter = new TypeConverterFormatter ();
- typeConverterFormatter.Register ();
- binaryObjectFormatter = new BinaryObjectFormatter ();
- binaryObjectFormatter.Register ();
- }
-
- // 0 == null
- static byte nextId = 1;
-
- public ObjectFormatter ()
- {
- PrimaryId = nextId ++;
- if (NumberOfIds == 1)
- return;
-
- SecondaryId = nextId ++;
- if (NumberOfIds == 2)
- return;
-
- TertiaryId = nextId ++;
- if (NumberOfIds == 3)
- return;
-
- throw new Exception ();
- }
-
- protected readonly byte PrimaryId, SecondaryId = 255, TertiaryId = 255;
-
- protected abstract void Write (BinaryWriter w, object o, WriterContext ctx);
- protected abstract object Read (byte token, BinaryReader r, ReaderContext ctx);
- protected abstract Type Type { get; }
- protected virtual int NumberOfIds { get { return 1; } }
-
- public virtual void Register ()
- {
- writeMap [Type] = this;
- readMap [PrimaryId] = this;
- if (SecondaryId != 255) {
- readMap [SecondaryId] = this;
- if (TertiaryId != 255)
- readMap [TertiaryId] = this;
- }
- }
-
- public static void WriteObject (BinaryWriter w, object o, WriterContext ctx)
- {
- #if TRACE
- if (o != null) {
- Trace.WriteLine (String.Format ("Writing {0} (type: {1})", o, o.GetType ()));
- Trace.Indent ();
- } else {
- Trace.WriteLine ("Writing null");
- }
- long pos = w.BaseStream.Position;
- #endif
-
- if (o == null) {
- w.Write ((byte) 0);
- return;
- }
-
- Type t = o.GetType ();
-
- ObjectFormatter fmt = writeMap [t] as ObjectFormatter;
- if (fmt == null) {
- // Handle abstract types here
-
- if (o is Type)
- fmt = typeFormatter;
- else if (t.IsEnum)
- fmt = enumFormatter;
- else if (t.IsArray && ((Array) o).Rank == 1)
- fmt = singleRankArrayFormatter;
- else {
- TypeConverter converter;
- converter = TypeDescriptor.GetConverter (o);
- if (converter == null ||
- !converter.CanConvertTo (typeof (string)) ||
- !converter.CanConvertFrom (typeof (string))) {
- fmt = binaryObjectFormatter;
- } else {
- typeConverterFormatter.Converter = converter;
- fmt = typeConverterFormatter;
- }
- }
- }
- fmt.Write (w, o, ctx);
- #if TRACE
- Trace.Unindent ();
- Trace.WriteLine (String.Format ("Wrote {0} (type: {1}) {2} bytes", o, o.GetType (), w.BaseStream.Position - pos));
- #endif
- }
-
- public static object ReadObject (BinaryReader r, ReaderContext ctx)
- {
- byte sig = r.ReadByte ();
-
- if (sig == 0)
- return null;
-
- return readMap [sig].Read (sig, r, ctx);
- }
-
- protected void Write7BitEncodedInt (BinaryWriter w, int value)
- {
- do {
- int high = (value >> 7) & 0x01ffffff;
- byte b = (byte)(value & 0x7f);
-
- if (high != 0) {
- b = (byte)(b | 0x80);
- }
-
- w.Write(b);
- value = high;
- } while(value != 0);
- }
-
- protected int Read7BitEncodedInt (BinaryReader r)
- {
- int ret = 0;
- int shift = 0;
- byte b;
-
- do {
- b = r.ReadByte();
-
- ret = ret | ((b & 0x7f) << shift);
- shift += 7;
- } while ((b & 0x80) == 0x80);
-
- return ret;
- }
- }
-
- #region Primitive Formatters
- class StringFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- short key;
- if (ctx.RegisterCache (o, out key)) {
- w.Write (SecondaryId);
- w.Write (key);
- } else {
- w.Write (PrimaryId);
- w.Write ((string)o);
- }
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- if (token == PrimaryId) {
- string s = r.ReadString ();
- ctx.CacheItem (s);
- return s;
- } else {
- return ctx.GetCache (r.ReadInt16 ());
- }
- }
- protected override Type Type {
- get { return typeof (string); }
- }
-
- protected override int NumberOfIds {
- get { return 2; }
- }
- }
-
- class Int64Formatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- w.Write (PrimaryId);
- w.Write ((long)o);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return r.ReadInt64 ();
- }
- protected override Type Type {
- get { return typeof (long); }
- }
- }
-
- class Int32Formatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- int i = (int) o;
- if ((int)(byte) i == i) {
- w.Write (SecondaryId);
- w.Write ((byte) i);
- } else {
- w.Write (PrimaryId);
- w.Write (i);
- }
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- if (token == PrimaryId)
- return r.ReadInt32 ();
- else
- return (int) r.ReadByte ();
- }
- protected override Type Type {
- get { return typeof (int); }
- }
-
- protected override int NumberOfIds {
- get { return 2; }
- }
- }
-
- class Int16Formatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- w.Write (PrimaryId);
- w.Write ((short)o);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return r.ReadInt16 ();
- }
- protected override Type Type {
- get { return typeof (short); }
- }
- }
-
- class ByteFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- w.Write (PrimaryId);
- w.Write ((byte)o);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return r.ReadByte ();
- }
- protected override Type Type {
- get { return typeof (byte); }
- }
- }
-
- class BooleanFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- if ((bool)o == true)
- w.Write (PrimaryId);
- else
- w.Write (SecondaryId);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return token == PrimaryId;
- }
-
- protected override Type Type {
- get { return typeof (bool); }
- }
-
- protected override int NumberOfIds {
- get { return 2; }
- }
- }
-
- class CharFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- w.Write (PrimaryId);
- w.Write ((char) o);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return r.ReadChar ();
- }
-
- protected override Type Type {
- get { return typeof (char); }
- }
- }
-
- class DateTimeFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- w.Write (PrimaryId);
- w.Write (((DateTime) o).Ticks);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return new DateTime (r.ReadInt64 ());
- }
-
- protected override Type Type {
- get { return typeof (DateTime); }
- }
- }
-
- class PairFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- Pair p = (Pair) o;
- w.Write (PrimaryId);
- WriteObject (w, p.First, ctx);
- WriteObject (w, p.Second, ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- Pair p = new Pair ();
- p.First = ReadObject (r, ctx);
- p.Second = ReadObject (r, ctx);
- return p;
- }
-
- protected override Type Type {
- get { return typeof (Pair); }
- }
- }
-
- class TripletFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- Triplet t = (Triplet) o;
- w.Write (PrimaryId);
- WriteObject (w, t.First, ctx);
- WriteObject (w, t.Second, ctx);
- WriteObject (w, t.Third, ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- Triplet t = new Triplet ();
- t.First = ReadObject (r, ctx);
- t.Second = ReadObject (r, ctx);
- t.Third = ReadObject (r, ctx);
- return t;
- }
-
- protected override Type Type {
- get { return typeof (Triplet); }
- }
- }
-
- class ArrayListFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- ArrayList l = (ArrayList) o;
-
- w.Write (PrimaryId);
- Write7BitEncodedInt (w, l.Count);
- foreach (object i in l)
- WriteObject (w, i, ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- int len = Read7BitEncodedInt (r);
- ArrayList l = new ArrayList (len);
-
- for (int i = 0; i < len; i++)
- l.Add (ReadObject (r, ctx));
-
- return l;
- }
-
- protected override Type Type {
- get { return typeof (ArrayList); }
- }
- }
-
- class HashtableFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- Hashtable ht = (Hashtable) o;
-
- w.Write (PrimaryId);
- Write7BitEncodedInt (w, ht.Count);
- foreach (DictionaryEntry de in ht) {
- WriteObject (w, de.Key, ctx);
- WriteObject (w, de.Value, ctx);
- }
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- int len = Read7BitEncodedInt (r);
- Hashtable ht = new Hashtable (len);
-
- for (int i = 0; i < len; i++) {
- object key = ReadObject (r, ctx);
- object val = ReadObject (r, ctx);
-
- ht.Add (key, val);
- }
-
- return ht;
- }
-
- protected override Type Type {
- get { return typeof (Hashtable); }
- }
- }
-
- class ObjectArrayFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- object [] val = (object []) o;
-
- w.Write (PrimaryId);
- Write7BitEncodedInt (w, val.Length);
- foreach (object i in val)
- WriteObject (w, i, ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- int len = Read7BitEncodedInt (r);
- object [] ret = new object [len];
-
- for (int i = 0; i < len; i++)
- ret [i] = ReadObject (r, ctx);
-
- return ret;
- }
-
- protected override Type Type {
- get { return typeof (object []); }
- }
- }
-
- #endregion
-
- #region System.Web Optimizations
- class ColorFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- Color c = (Color) o;
-
- if (!c.IsKnownColor) {
- w.Write (PrimaryId);
- w.Write (c.ToArgb ());
- } else {
- w.Write (SecondaryId);
- w.Write ((int) c.ToKnownColor ());
- }
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- if (token == PrimaryId)
- return Color.FromArgb (r.ReadInt32 ());
- else
- return Color.FromKnownColor ((KnownColor) r.ReadInt32 ());
- }
-
- protected override Type Type {
- get { return typeof (Color); }
- }
-
- protected override int NumberOfIds {
- get { return 2; }
- }
- }
-
- #endregion
-
- #region Special Formatters
- class EnumFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- object value = Convert.ChangeType (o, ((Enum) o).GetTypeCode ());
- w.Write (PrimaryId);
- WriteObject (w, o.GetType (), ctx);
- WriteObject (w, value, ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- Type t = (Type) ReadObject (r, ctx);
- object value = ReadObject (r, ctx);
-
- return Enum.ToObject (t, value);
- }
- protected override Type Type {
- get { return typeof (Enum); }
- }
- }
-
- class TypeFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- short key;
- if (ctx.RegisterCache (o, out key)) {
- w.Write (SecondaryId);
- w.Write (key);
- } else {
- w.Write (PrimaryId);
- w.Write (((Type) o).FullName);
-
- // We should cache the name of the assembly
- w.Write (((Type) o).Assembly.FullName);
- }
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- if (token == PrimaryId) {
- string type = r.ReadString ();
- string assembly = r.ReadString ();
-
- Type t = Assembly.Load (assembly).GetType (type);
- ctx.CacheItem (t);
- return t;
- } else {
- return ctx.GetCache (r.ReadInt16 ());
- }
- }
-
- protected override Type Type {
- get { return typeof (Type); }
- }
-
- protected override int NumberOfIds {
- get { return 2; }
- }
- }
-
- class SingleRankArrayFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- Array val = (Array) o;
-
- w.Write (PrimaryId);
- WriteObject (w, val.GetType ().GetElementType (), ctx);
-
- Write7BitEncodedInt (w, val.Length);
- foreach (object i in val)
- WriteObject (w, i, ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- Type t = (Type) ReadObject (r, ctx);
- int len = Read7BitEncodedInt (r);
- Array val = Array.CreateInstance (t, len);
-
- for (int i = 0; i < len; i++)
- val.SetValue (ReadObject (r, ctx), i);
-
- return val;
- }
-
- protected override Type Type {
- get { return typeof (Array); }
- }
- }
-
- class FontUnitFormatter : StringFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- base.Write (w, o.ToString (), ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return FontUnit.Parse ((string) base.Read (token, r, ctx));
- }
-
- protected override Type Type {
- get { return typeof (FontUnit); }
- }
- }
- class UnitFormatter : StringFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- base.Write (w, o.ToString (), ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- return Unit.Parse ((string) base.Read (token, r, ctx));
- }
-
- protected override Type Type {
- get { return typeof (Unit); }
- }
- }
- class TypeConverterFormatter : StringFormatter {
- TypeConverter converter;
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- w.Write (PrimaryId);
- ObjectFormatter.WriteObject (w, o.GetType (), ctx);
- string v = (string) converter.ConvertTo (null, CultureInfo.InvariantCulture,
- o, typeof (string));
- base.Write (w, v, ctx);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- Type t = (Type) ObjectFormatter.ReadObject (r, ctx);
- converter = TypeDescriptor.GetConverter (t);
- token = r.ReadByte ();
- string v = (string) base.Read (token, r, ctx);
- return converter.ConvertFrom (null, CultureInfo.InvariantCulture, v);
- }
-
- protected override Type Type {
- get { return typeof (TypeConverter); }
- }
- public TypeConverter Converter {
- set { converter = value; }
- }
- }
- class BinaryObjectFormatter : ObjectFormatter {
- protected override void Write (BinaryWriter w, object o, WriterContext ctx)
- {
- w.Write (PrimaryId);
-
- MemoryStream ms = new MemoryStream (128);
- new BinaryFormatter ().Serialize (ms, o);
-
- byte [] buf = ms.GetBuffer ();
- Write7BitEncodedInt (w, buf.Length);
- w.Write (buf, 0, buf.Length);
- }
-
- protected override object Read (byte token, BinaryReader r, ReaderContext ctx)
- {
- int len = Read7BitEncodedInt (r);
- byte [] buf = r.ReadBytes (len);
- if (buf.Length != len)
- throw new Exception ();
-
- return new BinaryFormatter ().Deserialize (new MemoryStream (buf));
- }
-
- protected override Type Type {
- get { return typeof (object); }
- }
- }
-
- #endregion
-
- #endregion
- }
- }
|