繁体   English   中英

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

[英]Why can I not deserialize my object correctly using 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);
}

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

请注意,我尝试用ProtoContractProtoMember替换DataContractDataMember无济于事。

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

[更新]
问题原来是由于[MyConsoleApp].vshost.exe存在,这显然是可执行文件的一个特殊版本,以帮助调试我认为在Rebuild之后会重新生成(显然不是)所以解决方案是手动删除它,现在一切正常工作:-)

无论如何,我会接受Marc的回答,因为他很友好地跟进,很快回复。

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM