void SerializeVersionSerializable(object instance, TypeSerializationArgs args) { if (instance == null) { args.Writer.Write(NullVersion); } else { IVersionSerializable ivs = instance as IVersionSerializable; args.Writer.Write((byte)ivs.CurrentVersion); ivs.Serialize(args.Writer); } }
bool DeserializeVersionSerializable(ref object instance, TypeSerializationArgs args) { byte version = args.Reader.ReadByte(); bool success = false; if (version != NullVersion) { if (instance == null) { instance = CreateInstance(); } IVersionSerializable ivs = instance as IVersionSerializable; args.Reader.Response = SerializationResponse.Success; try { ivs.Deserialize(args.Reader, version); } catch (Exception exc) { const bool indicateTruncate = true; string data = Algorithm.ToByteString(args.Reader.BaseStream, 2 << 11, indicateTruncate); throw new SerializationException(string.Format("Failed to deserialized type {0} version {1} data {2}", instance.GetType().FullName, version, data), exc); } success = true; //throw exception if necessary switch (args.Reader.Response) { case SerializationResponse.Handled: throw new HandledVersionException(ivs.CurrentVersion, version); case SerializationResponse.Unhandled: throw new UnhandledVersionException(ivs.CurrentVersion, version); default: break; } } else { instance = null; } return(success); }