Mat*_*olf 2 c# serialization protobuf-net deserialization
我成功序列化了以下类的实例,但是当我在收到以下错误消息后尝试反序列化时:" Invalid field in source data: 0".
我不知道它是指什么,因为我发现下面的课程直截了当.我刚刚将protobuf-net版本更新为2.00.614(运行时版本:2.0.50727).
知道我是否可能忽视一些微不足道的事情?
[ProtoContract]
public class TimeSeriesProperties
{
[ProtoMember(1)]
public string TimeSeriesName { get; private set; }
[ProtoMember(2)]
public string FileName { get; private set; }
[ProtoMember(3)]
public string TemplateName { get; private set; }
[ProtoMember(4)]
public int PacketLength { get; private set; }
[ProtoMember(5)]
public long FileSizeBytes { get; set; }
[ProtoMember(6)]
public long NumberRecords { get; set; }
[ProtoMember(7)]
public DateTime DateTimeStart { get; set; }
[ProtoMember(8)]
public DateTime DateTimeEnd { get; set; }
public TimeSeriesProperties()
{
}
public TimeSeriesProperties(string timeSeriesName, string fileName, string templateName, int PacketLength)
{
this.TimeSeriesName = timeSeriesName;
this.FileName = fileName;
this.TemplateName = templateName;
this.PacketLength = PacketLength;
}
}
public static byte[] Serialize_ProtoBuf<T>(T serializeThis)
{
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
return stream.GetBuffer();
}
}
public static T Deserialize_ProtoBuf<T>(byte[] byteArray)
{
using (var stream = new MemoryStream(byteArray))
{
return ProtoBuf.Serializer.Deserialize<T>(stream);
}
}
Run Code Online (Sandbox Code Playgroud)
我见过这个最常见的原因就是GetBuffer()在a上使用不正确MemoryStream.当我添加评论时,这已经是我的预感,但你已经确认了:
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
return stream.GetBuffer();
}
Run Code Online (Sandbox Code Playgroud)
GetBuffer返回超大的后备缓冲区.它最后有垃圾.这是完全正常使用GetBuffer,只要你还记录.Length,这是量的有效数据在那里.这可以避免额外分配潜在的大型阵列.但在您的情况下,可能会使用更简单的方法ToArray()来获取正确大小的缓冲区:
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
return stream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2951 次 |
| 最近记录: |