// // System.Runtime.Serialization.ObjectManagerTest.cs // // Author: Martin Baulig (martin@ximian.com) // // (C) Novell // using System; using System.IO; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using NUnit.Framework; namespace MonoTests.System.Runtime.Serialization { [TestFixture] public class ObjectManagerTest { [Test] // bug 76931 public void TestSerialization () { using (MemoryStream ms = new MemoryStream ()) { Bar bar = new Bar (8, 3, 5, 21); bar.Save (ms); ms.Position = 0; bar = Bar.Load (ms); Assert.AreEqual ("Bar [Foo (16),(Foo (6),Foo (10),Foo (42)]", bar.ToString (), "#1"); } } } public class Foo { public int Data; public Foo (int data) { this.Data = data; } public override string ToString () { return String.Format ("Foo ({0})", Data); } internal class SerializationSurrogate : ISerializationSurrogate { public void GetObjectData (object obj, SerializationInfo info, StreamingContext context) { Foo foo = (Foo) obj; info.AddValue ("data", foo.Data); } public object SetObjectData (object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { Foo foo = (Foo) obj; foo.Data = info.GetInt32 ("data"); return new Foo (2 * foo.Data); } } } [Serializable] public class Bar { public readonly Foo Foo; public readonly Foo[] Array; public Bar (int a, params int[] b) { Foo = new Foo (a); Array = new Foo[b.Length]; for (int i = 0; i < b.Length; i++) Array[i] = new Foo (b[i]); } public void Save (Stream stream) { SurrogateSelector ss = new SurrogateSelector (); StreamingContext context = new StreamingContext ( StreamingContextStates.Persistence, this); ss.AddSurrogate (typeof (Foo), context, new Foo.SerializationSurrogate ()); BinaryFormatter formatter = new BinaryFormatter (ss, context); formatter.Serialize (stream, this); } public static Bar Load (Stream stream) { SurrogateSelector ss = new SurrogateSelector (); StreamingContext context = new StreamingContext ( StreamingContextStates.Persistence, null); ss.AddSurrogate (typeof (Foo), context, new Foo.SerializationSurrogate ()); BinaryFormatter formatter = new BinaryFormatter (ss, context); return (Bar) formatter.Deserialize (stream); } public override string ToString () { StringBuilder sb = new StringBuilder (); sb.Append ("Bar ["); sb.Append (Foo); sb.Append (",("); for (int i = 0; i < Array.Length; i++) { if (i > 0) sb.Append (","); sb.Append (Array[i]); } sb.Append ("]"); return sb.ToString (); } } class X { static void Main () { using (MemoryStream ms = new MemoryStream ()) { Bar bar = new Bar (8, 3, 5, 21); bar.Save (ms); ms.Position = 0; bar = Bar.Load (ms); Console.WriteLine (bar); } } } }