1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
8 using System.Runtime.Serialization.Formatters.Binary;
\r
9 using System.Reflection;
\r
10 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
12 namespace System.Runtime.Serialization
\r
14 public static class SerializationTestServices
\r
17 /// Serializes and then deserializes the specified value.
\r
19 public static T RoundTrip<T>(T value)
\r
21 Assert.IsNotNull(value);
\r
23 using (MemoryStream stream = new MemoryStream())
\r
25 BinaryFormatter formatter = new BinaryFormatter();
\r
26 formatter.Serialize(stream, value);
\r
28 stream.Seek(0, SeekOrigin.Begin);
\r
29 return (T)formatter.Deserialize(stream);
\r
34 /// Creates an instance of a type using the serialization constructor.
\r
36 public static T Create<T>(SerializationInfo info, StreamingContext context)
\r
38 ConstructorInfo constructor = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null,
\r
39 new Type[] { typeof(SerializationInfo), typeof(StreamingContext) },
\r
40 (ParameterModifier[])null);
\r
42 Assert.IsNotNull(constructor, "Type does not have a private or protected serialization constructor.");
\r
46 return (T)constructor.Invoke(new object[] { info, context });
\r
48 catch (TargetInvocationException ex)
\r
50 throw ex.InnerException;
\r
55 /// Returns a new instance of <see cref="SerializationInfo"/> replacing the specified member name with the specified value.
\r
57 public static SerializationInfo CreateSerializationInfoReplacingMember<T>(string memberName, object value)
\r
58 where T : ISerializable, new()
\r
60 return CreateSerializationInfoReplacingMember(memberName, value, () => new T());
\r
64 /// Returns a new instance of <see cref="SerializationInfo"/> replacing the specified member name with the specified value.
\r
66 public static SerializationInfo CreateSerializationInfoReplacingMember<T>(string memberName, object value, Func<T> creator)
\r
67 where T : ISerializable
\r
69 T serializableObject = creator();
\r
71 var info = GetObjectDataFrom(serializableObject);
\r
73 return CloneReplacingMember<T>(info, memberName, value);
\r
77 /// Returns a new instance of <see cref="SerializationInfo"/> removing the specified member name.
\r
79 public static SerializationInfo CreateSerializationInfoRemovingMember<T>(string memberName)
\r
80 where T : ISerializable, new()
\r
82 return CreateSerializationInfoRemovingMember(memberName, () => new T());
\r
86 /// Returns a new instance of <see cref="SerializationInfo"/> removing the specified member name.
\r
88 public static SerializationInfo CreateSerializationInfoRemovingMember<T>(string memberName, Func<T> creator)
\r
89 where T : ISerializable
\r
91 T serializableObject = creator();
\r
93 var info = GetObjectDataFrom(serializableObject);
\r
95 return CloneRemovingMember<T>(info, memberName);
\r
98 private static SerializationInfo CloneReplacingMember<T>(SerializationInfo info, string memberName, object value)
\r
100 return Clone<T>(info, (entry, clone) =>
\r
102 if (entry.Name != memberName)
\r
107 // Replace the entry
\r
108 clone.AddValue(entry.Name, value, value == null ? entry.ObjectType : value.GetType());
\r
113 private static SerializationInfo CloneRemovingMember<T>(SerializationInfo info, string memberName)
\r
115 return Clone<T>(info, (entry, clone) =>
\r
117 // Add everything except the member we want to remove
\r
118 return entry.Name != memberName;
\r
122 private static SerializationInfo Clone<T>(SerializationInfo info, Func<SerializationEntry, SerializationInfo, bool> predicate)
\r
124 var clone = GetEmptySerializationInfo<T>();
\r
126 foreach (var entry in info)
\r
128 if (predicate(entry, clone))
\r
130 clone.AddValue(entry.Name, entry.Value, entry.ObjectType);
\r
137 private static SerializationInfo GetObjectDataFrom<T>(T serializableObject) where T : ISerializable
\r
139 var info = GetEmptySerializationInfo<T>();
\r
141 serializableObject.GetObjectData(info, new StreamingContext());
\r
146 private static SerializationInfo GetEmptySerializationInfo<T>()
\r
148 StrictFormatterConverter converter = new StrictFormatterConverter();
\r
150 return new SerializationInfo(typeof(T), converter);
\r
155 #endif // !SILVERLIGHT