我正在使用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,而只是存储字符串并将字符串附加到它?
答案 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构建中修复。