Оказывается, что несмотря на мои усилия , да, в одном из предыдущих сборок произошли серьезные изменения в формате данных.Это влияет только на данные ushort
, которые были исключены из обработки в одной точке.Это прискорбно, но хорошая новость заключается в том, что никакие данные не потеряны - доступ к ним просто немного неудобен (в настоящее время они по существу записываются через строку).
Вот мойпредложенный обходной путь;для такого члена, как:
[ProtoBuf.ProtoMember(1)]
public ushort[] Data {get;set;}
Замените это на:
[ProtoBuf.ProtoMember(1)]
private string[] LegacyData {get;set;}
private bool LegacyDataSpecified { get { return false; } set { } }
/* where 42 is just an unused new field number */
[ProtoBuf.ProtoMember(42, Options = MemberSerializationOptions.Packed)]
public ushort[] Data { get; set; }
[ProtoBuf.ProtoAfterDeserialization]
private void SerializationCallback()
{
if (LegacyData != null && LegacyData.Length > 0)
{
ushort[] parsed = Array.ConvertAll<string, ushort>(
LegacyData, ushort.Parse);
if (Data != null && Data.Length > 0)
{
int oldLen = parsed.Length;
Array.Resize(ref parsed, parsed.Length + Data.Length);
Array.Copy(Data, 0, parsed, oldLen, Data.Length);
}
Data = parsed;
}
LegacyData = null;
}
Это импортирует данные старого стиля в LegacyData
и объединяет их во время (после)сериализация или запись данных в новом стиле из Data
.Быстрее, меньше и поддерживает как старые, так и новые данные.