0

你能解释一下为什么下面的代码不能工作吗?

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

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

4

2 回答 2

0

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

于 2014-01-04T09:39:33.683 回答
0

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

作为备选:

return Serializer.DeepClone(this);
于 2014-01-04T14:56:27.807 回答