File: ObjectManagerTest.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (132 lines) | stat: -rw-r--r-- 2,764 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
// 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 ();
		}
	}
}