[英]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
。 关于我做错了什么的任何想法?
请注意,我尝试用ProtoContract
和ProtoMember
替换DataContract
和DataMember
无济于事。
只有在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.