protobuf网的错误消息"在源数据的无效字段:0" [英] ProtoBuf-Net error message " Invalid field in source data: 0"

查看:1262
本文介绍了protobuf网的错误消息"在源数据的无效字段: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网的错误消息&QUOT;在源数据的无效字段:0&QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆