用protobuf-net实现ICloneable

时间:2014-01-04 06:59:39

标签: serialization protobuf-net cloneable

您能否解释一下为什么以下代码无效?

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和一个空字符串 作为适当的属性值。

UPD .: 如果我序列化为二进制文件,然后打开,如果读取,从而创建一个新的流 代码有效。是否有可能避免使用中间二进制文件并仅使用一个流进行序列化和反序列化?

2 个答案:

答案 0 :(得分:0)

找出问题,忘记重置内存流的位置

答案 1 :(得分:0)

问题是流的位置需要重置为零。

作为替代方案:

return Serializer.DeepClone(this);