1

我正在将 protobuf-net lib 与 protobuf-net memcache 提供程序一起使用,并且我正在尝试使用 memcache 附加功能:

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

它抛出异常:

运行时遇到致命错误。错误地址位于线程 0xd58 上的 0x63765a43。错误代码为 0xc0000005。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。

我已经进行了一些调试并找出引发异常的位置:

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

value是我想设置为值的 ArraySegment,它dest是 ProtoBuf.ProtoWriter。

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

4

1 回答 1

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 的下一个版本中得到修复。

于 2013-05-30T14:08:37.337 回答