1

protobuf-net memcache プロバイダーで protobuf-net lib を使用しており、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 で、ProtoBuf.ProtoWriterdestです。

そのエラーを修正する方法はありますか、それとも何か間違ったことをしているのかもしれません。たぶん、単に 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 に答える