I also tried to serialize a substitute based on an interface:
class Program
{
static void Main(string[] args)
{
var root = Substitute.For<IRoot>();
var formatter = new BinaryFormatter();
IRoot newRoot = null;
using(var stream = new MemoryStream())
{
formatter.Serialize(stream, root);
stream.Position = 0;
newRoot = formatter.Deserialize(stream) as IRoot;
}
}
}
public interface IRoot
{
string Data { get; set; }
}
This gives a different error:
System.Runtime.Serialization.SerializationException was unhandled
Message=Type 'NSubstitute.Core.CallRouter' in Assembly 'NSubstitute,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=92dd2e9066daa5ca' is
not marked as serializable.
Source=mscorlib
StackTrace:
at
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType
type)
at
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type
type, StreamingContext context)
at
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
at
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object
obj, ISurrogateSelector surrogateSelector, StreamingContext context,
SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter,
ObjectWriter objectWriter, SerializationBinder binder)
at
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo
objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
at
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object
graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream
serializationStream, Object graph, Header[] headers, Boolean fCheck)
at
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream
serializationStream, Object graph)
at SerializeNSubstitute.Program.Main(String[] args) in G:
\JasonBock\Personal\.NET Projects\SerializeNSubstitute\Program.cs:line
18
InnerException:
Looking at the object at runtime I can see this field and its' type
isn't serializable, so I'm wondering if it should be marked
[NonSerialized]. There's an array in the object (IInterceptor) as well
and I'm thinking it should be looked at as the type in this array
(CastleForwardingInterceptor) isn't serializable either. Of course,
marking them as not serialized may screw things up when it's
deserialized.