Обычно я пишу все части кода на C#, а при написании сериализованных протоколов я использую FastSerializer, который сериализует/десериализует классы быстро и эффективно. Он также очень прост в использовании и достаточно прямолинеен для "управления версиями", т.е. для обработки различных версий сериализации. То, что я обычно использую, выглядит так:
public override void DeserializeOwnedData(SerializationReader reader, object context)
{
base.DeserializeOwnedData(reader, context);
byte serializeVersion = reader.ReadByte(); // used to keep what version we are using
this.CustomerNumber = reader.ReadString();
this.HomeAddress = reader.ReadString();
this.ZipCode = reader.ReadString();
this.HomeCity = reader.ReadString();
if (serializeVersion > 0)
this.HomeAddressObj = reader.ReadUInt32();
if (serializeVersion > 1)
this.County = reader.ReadString();
if (serializeVersion > 2)
this.Muni = reader.ReadString();
if (serializeVersion > 3)
this._AvailableCustomers = reader.ReadList<uint>();
}
и
public override void SerializeOwnedData(SerializationWriter writer, object context)
{
base.SerializeOwnedData(writer, context);
byte serializeVersion = 4;
writer.Write(serializeVersion);
writer.Write(CustomerNumber);
writer.Write(PopulationRegistryNumber);
writer.Write(HomeAddress);
writer.Write(ZipCode);
writer.Write(HomeCity);
if (CustomerCards == null)
CustomerCards = new List<uint>();
writer.Write(CustomerCards);
writer.Write(HomeAddressObj);
writer.Write(County);
// v 2
writer.Write(Muni);
// v 4
if (_AvailableCustomers == null)
_AvailableCustomers = new List<uint>();
writer.Write(_AvailableCustomers);
}
. Так что легко добавить что-то новое или полностью изменить сериализацию, если захочется.
Тем не менее, теперь я хочу использовать JSON по причинам, не относящимся к делу =) В настоящее время я использую DataContractJsonSerializerи сейчас ищу способ иметь такую же гибкость, как и FastSerializer, описанный выше.
Итак, вопрос в том; как лучше всего создать протокол/сериализацию JSON и иметь возможность детализировать сериализацию, как указано выше, чтобы я не нарушил сериализацию только потому, что другая машина еще не обновила свою версию?