protobuf网的错误消息"在源数据的无效字段:0" [英] ProtoBuf-Net error message " Invalid field in source data: 0"
问题描述
无效的字段源数据:0
我在序列化下面的类的实例,当我尝试反序列化之后,我得到了以下错误消息成功,但。
我不知道是什么它指的是因为我发现下面的类直线前进。我刚刚更新protobuf网版本2.00.614(运行时版本:2.0.50727)。
任何想法,我是否有可能忽视的东西微不足道
[ProtoContract]
公共类TimeSeriesProperties
{
[ProtoMember(1)]
公共字符串TimeSeriesName {搞定;私人集; }
[ProtoMember(2)]
公共字符串文件名{获得;私人集; }
[ProtoMember(3)]
公共字符串TEMPLATENAME {搞定;私人集; }
[ProtoMember(4)]
公众诠释PacketLength {搞定;私人集; }
[ProtoMember(5)]
众长FileSizeBytes {搞定;组; }
[ProtoMember(6)]
众长NumberRecords {搞定;组; }
[ProtoMember(7)]
公众的DateTime DateTimeStart {搞定;组; }
[ProtoMember(8)]
公众的DateTime DateTimeEnd {搞定;组; }
公共TimeSeriesProperties()
{
}
公共TimeSeriesProperties(字符串timeSeriesName,字符串文件名,字符串TEMPLATENAME,INT PacketLength)
{
this.TimeSeriesName = timeSeriesName;
this.FileName =文件名;
this.TemplateName = TEMPLATENAME;
this.PacketLength = PacketLength;
}
}
公共静态的byte [] Serialize_ProtoBuf< T>(T serializeThis)
{
使用(VAR流=新的MemoryStream())
{
ProtoBuf.Serializer.Serialize< T>(流serializeThis);
返回stream.GetBuffer();
}
}
公共静态牛逼Deserialize_ProtoBuf< T>(字节[]的字节数组)
{
使用(VAR流=新的MemoryStream(字节阵列) )
{
返回ProtoBuf.Serializer.Deserialize< T>(流);
}
}
的最常见的原因我已经看到了这简直是不正确的使用中的GetBuffer()
在的MemoryStream
。这已经是我的预感,当我说我的意见,但你已经证实了它:使用(VAR流=新的MemoryStream
( ))
{
ProtoBuf.Serializer.Serialize< T>(流serializeThis);
返回stream.GetBuffer();
}
的GetBuffer
返回超大后备缓冲器。它在它的末端都是垃圾。这是完全正常使用的GetBuffer
,只要您还录制。长度
,这是的有效数据在那里的数量。这可避免潜在的大阵的额外拨款。但是,在你的情况,一个简单的方法可能是使用 ToArray的()
来获得的右键大小的缓冲区:
使用(VAR流=新的MemoryStream())
{
ProtoBuf.Serializer.Serialize< T>(流serializeThis);
返回stream.ToArray();
}
I succeed in serializing instances of the following class but when I try to deserialize right after I get the following error message: " Invalid field in source data: 0"
.
I have no clue what it refers to because I find below class straight forward. I just updated protobuf-net version to 2.00.614 (runtime version: 2.0.50727).
Any idea whether I am possibly overlooking something trivial?
[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);
}
}
The most common cause I've seen of this is simply incorrect use of GetBuffer()
on a MemoryStream
. That was already my hunch when I added my comment, but you've confirmed it:
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
return stream.GetBuffer();
}
GetBuffer
returns the oversized backing-buffer. It has garbage at the end of it. It is perfectly fine to use GetBuffer
, as long as you also record the .Length
, which is the amount of valid data in there. This can avoid an extra allocation of a potentially large array. But in your case, a simpler approach is probably to use ToArray()
to get a right-sized buffer:
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
return stream.ToArray();
}
这篇关于protobuf网的错误消息"在源数据的无效字段:0"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!