1

コードベース(バージョン2.0.0.480)で使用していた以前のprotobuf-netビルドを最新のビルド(バージョン2.0.0.580)に置き換えました-.Net4.0または.Net4.5に対する特定のビルドがないため最新のprotobufバージョンでは、プロジェクトでnet30フルdllを参照しています。

System.Xml.Linq.XElementを含む複合型をシリアル化しようとすると、protobufシリアライザーからInvalidOperationExceptionが発生します-例外メッセージには、「型にシリアライザーが定義されていません:System.Xml.Linq.XElement」と表示されます。

XElementのシリアライザーがないことは、.Net 4.0ビルドがないことに関連していると思います(プロジェクトでSystem.Xml.Linq.dllのv4.0.30319を参照しているため)。

私のプロジェクトは.NET4.5プラットフォームを対象としています。protobuf-netV2.0.0.480net40ビルドを参照する場合は正常に機能します。

4

1 に答える 1

0

これは、「解析可能な型」に関連しているように見えます。つまり、処理が組み込まれていないものの、特定のパターンを満たしてstring. これは過去にいくつかの問題を引き起こしたので、次の方法でオプションでサポートされてい.AllowParseableTypesます。

static void Main()
{
    XElement el = XElement.Parse("<xml />");
    var model = TypeModel.Create(); // store and re-use this; don't use
    model.AllowParseableTypes = true; // a new one each time! (very bad)

    var foo = new Foo { Bar = el };
    var clone = (Foo) model.DeepClone(foo);
    var cloneEl = clone.Bar;
}
[ProtoContract]
class Foo
{
    [ProtoMember(1)]
    public XElement Bar { get; set; }
}

ここで a を宣言しなければならなかった理由はFoo、「ルート オブジェクト」の処理 (メンバー/サブオブジェクトの処理とはまったく異なります) が解析可能な型をチェックしていないように見えるためです。原因を調べて修正する必要があります。以下が機能することを願っています(現在は機能していませんが、おそらく機能するはずです):

static void Main()
{
    XElement el = XElement.Parse("<xml />");
    var model = TypeModel.Create(); // store and re-use this; don't use
    model.AllowParseableTypes = true; // a new one each time! (very bad)

    var cloneEl = (XElement)model.DeepClone(el);
}
于 2012-09-28T10:32:03.730 に答える