为什么我不能使用ProtoBuf-Net正确反序列化我的对象?

时间:2014-09-01 00:20:40

标签: c# serialization deserialization protobuf-net

我刚刚开始使用ProtoBuf-Net并拥有以下对象:

[DataContract]
public class Statistics
{
    [DataMember(Order = 1)]
    public DateTime DateTimeAsUtc { get; set; }

    [DataMember(Order = 2)]
    public IEnumerable<StatisticsRow> TopHashTags { get; set; }

    [DataMember(Order = 3)]
    public IEnumerable<StatisticsRow> TopWords { get; set; }    
}

[DataContract]
public class StatisticsRow
{
    [DataMember(Order = 1)]
    public string Key { get; set; }

    [DataMember(Order = 2)]
    public int Count { get; set; }
}


// Serialize then DeSerialize
using (var stream = new MemoryStream())
{
    Serializer.Serialize(stream, stats);

    stream.Seek(0, SeekOrigin.Begin);
    var deserialized = Serializer.Deserialize<Statistics>(stream);
}

当我序列化并尝试反序列化对象时,我为所有其他属性获取DateTimeAsUtcnull的默认值。关于我做错了什么想法?

请注意,我已尝试将DataContractDataMember替换为ProtoContractProtoMember,但无济于事。

只有在Release模式下才会出现此问题。

[更新]
该问题原因是[MyConsoleApp].vshost.exe显然存在{strong> a special version of the executable to aid debugging ,我认为这会在Rebuild之后重新生成(显然不是)解决方案是手动删除它,现在一切正常: - )

无论如何,我会接受Marc的回答,因为他很乐意跟进,并且很快回复。

1 个答案:

答案 0 :(得分:3)

以您的示例为基础,这对我来说很好用:

using (var stream = new MemoryStream()) {
    var stats = new Statistics {
        DateTimeAsUtc = DateTime.UtcNow,
        TopWords = new List<StatisticsRow> {
            new StatisticsRow { Count = 1, Key = "abc" }
        },
        TopHashTags = new List<StatisticsRow> {
            new StatisticsRow { Count = 2, Key = "def" }
        }
    };
    Serializer.Serialize(stream, stats);

    stream.Seek(0, SeekOrigin.Begin);
    var deserialized = Serializer.Deserialize<Statistics>(stream);
    Console.WriteLine(deserialized.DateTimeAsUtc);
    foreach(var row in deserialized.TopWords)
        Console.WriteLine("{0}: {1}", row.Key, row.Count);
    foreach (var row in deserialized.TopHashTags)
        Console.WriteLine("{0}: {1}", row.Key, row.Count);
}

所以......它可能需要一个完整的(失败的)示例才能回答。然而,要检查的第一件事是stream.Length;如果是0,则没有序列化的数据。暂且不方便:实现类似于:

var deserialized = Serializer.DeepClone(stats);