2014-01-04 2 views
1

Не могли бы вы объяснить, почему следующий фрагмент кода не работает?Реализация ICloneable с protobuf-net

static void Main(string[] args) 
    { 
     var simpleObject = new SimpleObjectDTO { Id = 1, Name = "Jacob" }; 
     const string format = "{2} object properties are: Id {0} Name {1}"; 
     Console.WriteLine(format, simpleObject.Id, simpleObject.Name, "Original"); 
     var clone = simpleObject.Clone() as SimpleObjectDTO; 
     // ReSharper disable PossibleNullReferenceException 
     Console.WriteLine(format, clone.Id, clone.Name, "Clone"); 
     // ReSharper restore PossibleNullReferenceException 
     Console.ReadLine(); 
    } 

где

[ProtoContract] 
public class SimpleObjectDTO : ICloneable 
{ 
    [ProtoMember(1)] 
    public int Id { get; set; } 
    [ProtoMember(2)] 
    public string Name { get; set; } 

    public object Clone() 
    { 
     using (var stream = new MemoryStream()) 
     { 
      Serializer.Serialize(stream, this); 
      stream.Flush(); 
      var clone = Serializer.Deserialize<SimpleObjectDTO>(stream); 
      return clone; 
     }    
    } 
} 

код работает просто отлично, но десериализованный объект имеет 0 и пустая строка как значения соответствующих свойств.

Обновление: Если я сериализую в двоичный файл и затем открываю, если для чтения создается таким образом новый поток , код работает. Есть ли возможность избежать промежуточных двоичных файлов и использовать только один поток для сериализации и десериализации?

ответ

0

проблемы Тра позиция потока в должна быть обнулена.

В качестве альтернативы:

return Serializer.DeepClone(this); 
1

Разобрался вопрос, забыл сбросить позицию потока памяти в

Смежные вопросы