Protobuf-net memcache提供程序在append / set ArraySegment上失败

时间:2013-05-30 14:01:54

标签: .net protocol-buffers protobuf-net

我正在使用protobuf-net lib和protobuf-net memcache提供程序,我正在尝试使用memcache append函数:

var data = new ArraySegment<byte>(Encoding.UTF8.GetBytes("appendedString"));
var result = _memcache.ExecuteStore(StoreMode.Add, key, data);

它抛出异常:

  

运行时遇到了致命错误。错误的地址   在0x63765a43处,在线程0xd58上。错误代码是0xc0000005。这个   错误可能是CLR中的错误,也可能是不安全或不可验证的错误   用户代码的一部分。此错误的常见来源包括用户   COM-interop或PInvoke的编组错误,可能会破坏   叠加。

我已经做了一些调试,并在引发异常时查找地点:

  

/Meta/RuntimeTypeModel.cs:692:   ((MetaType)types [key])。Serializer.Write(value,dest);

这里value是我想要设置为值的ArraySegment,而dest是ProtoBuf.ProtoWriter。

有没有办法解决这个错误,或者,也许,我做错了什么。也许我只是需要存储不是一个ArraySegment,而只是存储字符串并将字符串附加到它?

1 个答案:

答案 0 :(得分:2)

嘿;老实说,我从来没有测试ArraySegment<T> - 尽管CLR团队的意图,它根本就没有那么多使用。我可以通过一个非常简单的测试重现这个:

using ProtoBuf;
using System;
[ProtoContract]
class Foo
{
    [ProtoMember(1)]
    public ArraySegment<byte> Data { get; set; }
    static void Main()
    {
        var obj = new Foo { Data = new ArraySegment<byte>(new byte[] { 1, 2, 3 })};
        Serializer.PrepareSerializer<Foo>();
        var clone = Serializer.DeepClone(obj);
    }
}

我将添加到测试套件中并修复。

目前,我可以建议:只需存储byte[] ...(即不要使用ArraySegment<T>)。这可能会在下一个protobuf-net构建中修复。