Я столкнулся с проблемой несогласованности после десериализации с использованием protobuf-net.Несоответствия после десериализации с использованием protobuf-net
Класс Я хотел бы сериализации/десериализации выглядит следующим образом:
[ProtoContract]
public class TSS
{
[ProtoMember(1, AsReference = true)]
public EventManager eventManager { get; private set; }
[ProtoMember(2)]
public DateTime referenceDateTime { get; private set; }
[ProtoMember(3)]
public Mode mode;
}
А внутри класса EventManager, это выглядит следующим образом:
[ProtoContract]
public class EventManager
{
[ProtoMember(1)]
public InputQueue inputQueue = new InputQueue();
[ProtoMember(2)]
public InputQueue InputQueue
{
get { return this.inputQueue; }
set { this.inputQueue = value; }
}
[ProtoMember(7, AsReference = true)]
public TSS tss;
}
УТП в классе EventManager является отнесение объекта TSS , а eventManager в классе TSS является ссылкой объекта EventManager. Именно по этой причине я поставил AsReference = true
там (это правильный путь?)
я сериализации, как:
public void StateSaving(int time, TSS tss)
{
Stream memoryStream = new MemoryStream();
Serializer.Serialize(memoryStream, tss);
states.Add(time, memoryStream);
}
и сделать десериализации как:
public void Deserialize(int time, ref TSS tss)
{
Stream memoryStream = states[time];
memoryStream.Position = 0;
tss = Serializer.Deserialize<TSS>(memoryStream);
}
Проблема в том, что всякий раз, когда я десериализация, структуры данных, такие как inputQueue в EventManager, заполняются значениями NULL, а не фактическими значениями в этой точке. Я новичок в protobuf-net, поэтому, пожалуйста, укажите любые ошибки (я считаю, что их много).
Спасибо заранее!
Постараюсь Репрографический утром –
Есть несколько вещей, которые касаются меня здесь ; первый - 'inputQueue' - он, кажется, сериализуется как как' 1', так и '2' (одна и та же очередь) - это может привести к дублированию или худшему; второй - параллелизм: этот код многопоточен?если это так, сохранение «Потока» опасно, так как «Стрим» не будет хорошо воспроизводиться из нескольких потоков (лучше было бы хранить 'byte []'). Однако я не могу воспроизвести эту проблему. У вас есть короткий *, но полный * пример проблемы, которую вы видите? (т. е. я могу скомпилировать и выполнить, и это покажет мне проблему) –
@MarcGravell Спасибо за ваш быстрый ответ. Я нашел проблему, в основном есть «список», который нужно десериализовать. И этот список представляет собой список событий, в которых конструкторы событий имеют параметры, и когда он пытается десериализовать, программа будет запускать _parameterless constructors_ (я вручную добавил эти конструкторы для исключения исключений) вместо _right ones_ (с параметрами). Я знаю, что так работает сериализация/десериализация, но есть ли способ, чтобы я мог сериализовать и десериализовать этот список правильно? – Lin