2013-11-18 3 views
1

Я столкнулся с проблемой несогласованности после десериализации с использованием 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, поэтому, пожалуйста, укажите любые ошибки (я считаю, что их много).

Спасибо заранее!

+0

Постараюсь Репрографический утром –

+0

Есть несколько вещей, которые касаются меня здесь ; первый - 'inputQueue' - он, кажется, сериализуется как как' 1', так и '2' (одна и та же очередь) - это может привести к дублированию или худшему; второй - параллелизм: этот код многопоточен?если это так, сохранение «Потока» опасно, так как «Стрим» не будет хорошо воспроизводиться из нескольких потоков (лучше было бы хранить 'byte []'). Однако я не могу воспроизвести эту проблему. У вас есть короткий *, но полный * пример проблемы, которую вы видите? (т. е. я могу скомпилировать и выполнить, и это покажет мне проблему) –

+0

@MarcGravell Спасибо за ваш быстрый ответ. Я нашел проблему, в основном есть «список», который нужно десериализовать. И этот список представляет собой список событий, в которых конструкторы событий имеют параметры, и когда он пытается десериализовать, программа будет запускать _parameterless constructors_ (я вручную добавил эти конструкторы для исключения исключений) вместо _right ones_ (с параметрами). Я знаю, что так работает сериализация/десериализация, но есть ли способ, чтобы я мог сериализовать и десериализовать этот список правильно? – Lin

ответ

1

(с комментариями)

Я расположенной проблемы, в основном есть список, который должен быть десериализации. И этот список представляет собой список событий, в которых конструкторы событий имеют параметры, и когда он пытается десериализовать, программа будет запускать беззаметные конструкторы (я вручную добавил эти конструкторы для исключения исключений) вместо правого (с параметрами). Я знаю, что так работает сериализация/десериализация, но есть ли способ, чтобы я мог сериализовать и десериализовать этот список правильно?

А, действительно. Существуют различные подходы, когда дело доходит до строительства объекта:

  • использовать конструктор без параметров
  • искать конструктор, который соответствует всем определенным членам
  • пропустить конструктор полностью
  • использовать пользовательский объект завод
  • использовать суррогатный объект и пользовательские преобразования

вещи, как XmlSerializer используйте первый; такие вещи, как DataContractSerializer и BinaryFormatter используют 3-й; хорошей новостью является то, что protobuf-net поддерживает все 5. Я полагаю, что в вашем случае лучшим вариантом является использование 3-й вариант для этого типа, которые вы можете сделать:

[ProtoContract(SkipConstructor=true)] 
Смежные вопросы