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);
        }