我刚刚开始使用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
的默认值。关于我做错了什么想法?
请注意,我已尝试将DataContract
和DataMember
替换为ProtoContract
和ProtoMember
,但无济于事。
只有在Release
模式下才会出现此问题。
[更新] 的
该问题原因是[MyConsoleApp].vshost.exe
显然存在{strong> a special version of the executable to aid debugging ,我认为这会在Rebuild
之后重新生成(显然不是)解决方案是手动删除它,现在一切正常: - )
无论如何,我会接受Marc的回答,因为他很乐意跟进,并且很快回复。
答案 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);