Protobuf-net r282 имеет проблемы с десериализацией объекта, сериализованного с r249 - PullRequest
2 голосов
/ 09 сентября 2010

Я только что обновил с r249 до r282.Кроме замены DLL я не сделал никаких изменений.К сожалению, сейчас десериализация объектов, созданных до обновления, занимает значительно больше времени.То, что раньше занимало две секунды, теперь занимает пять минут.

Были ли изменения в синтаксисе между версиями?Есть что-то, что он больше не поддерживает?

Все мои классы используют ProtoContract, ProtoMember и ProtoInclude.Я бегу VS2010.Насколько я был обеспокоен, не было никаких проблем с моим буферным кодом протокола.Я только пытаюсь обновить, потому что я решил, что хорошо иметь самую последнюю версию.

Edit - 2010.09.09 Одним из свойств моего объекта является массив ushorts.Я только что заметил, что это свойство не сериализовало / десериализовало должным образом с r282.Полученные значения массива все нули.Массив имел значения до сериализации (r282), но не после десериализации (r282).

1 Ответ

2 голосов
/ 09 сентября 2010

Оказывается, что несмотря на мои усилия , да, в одном из предыдущих сборок произошли серьезные изменения в формате данных.Это влияет только на данные 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.Быстрее, меньше и поддерживает как старые, так и новые данные.

...