>public class ShapeCanvas4 : Canvas >{ > public string SomeField; > public ShapeCanvas4() > { > } >}And here's an equally simple Serialization surrogate:
public class ShapeCanvas4Surrogate : ISerializationSurrogate > { > public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) > { > ShapeCanvas4 sc3 = (ShapeCanvas4)obj; > info.AddValue("SomeField", sc3.SomeField); > info.AddValue("Name", sc3.Name); > } > public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) > { > ShapeCanvas4 sc4 = (ShapeCanvas4)obj; > sc4.SomeField =info.GetString("SomeField"); > string s = info.GetString("Name"); > sc4.Name = s; > return sc4; > } >}I instantiate an instance of ShapeCanvas4, set SomeField to something, register the surrogate with a BinaryFormatter and serialize it. When I deserialize I get an InvalidOperationException on the line "sc4.Name = s;" Message is "Current local value enumeration is outdated because one or more local values have been set since its creation.". Anyone know why this doesn't work ?
>ShapeCanvas4 sc4 = new ShapeCanvas4(); >sc4.SomeField = "Fred"; > >MemoryStream fs = new MemoryStream(); >BinaryFormatter formatter = new BinaryFormatter(); > >SurrogateSelector ss = new SurrogateSelector(); >ShapeCanvas4Surrogate sc4Surrogate = new ShapeCanvas4Surrogate(); >ss.AddSurrogate(typeof(ShapeCanvas4), new StreamingContext(StreamingContextStates.All), sc4Surrogate); >formatter.SurrogateSelector = ss; > >formatter.Serialize(fs, sc4); >fs.Position = 0; >ShapeCanvas4 newSC4 = (ShapeCanvas4)formatter.Deserialize(fs);>(Guess I should have posted this in a general .NET category since it's not WPF specific)