0

シリアル化のためのバイナリフォーマッターの使用を Protobuf-net に置き換えようとしています。私は多くの問題に遭遇し、推奨される方法を知りたいと思っています。シリアライズしたいクラスがたくさんあります。彼らは、ソリューション内の多くのプロジェクトに参加しています。

シリアル化するクラスが含まれている同じプロジェクトから Serialize を呼び出そうとすると、動作しますが、それらが異なるプロジェクトにある場合は、契約を知らずに失敗します。私たちのクラスは、他のプロジェクトで定義された型 (構造体) も使用します。この構造体を使用してクラスをシリアライズしようとすると、その型を認識しないという同じ問題が発生します。PrepareSerializer を使用して型を手動で追加すると、シリアル化されます...しかし、逆シリアル化しようとすると、部分的に信頼された呼び出し元が許可されていないというエラーが表示されます。

また、プリコンパイル ユーティリティを使用しようとしましたが、私たちのクラスはパブリック アクセサーでプライベート フィールドを使用し、プライベート フィールドを処理できないというエラーが表示されるため、これを使用してバイナリ フォーマッタを置き換えることはできませんか?

これらの問題を回避するにはどうすればよいですか?

編集 - これは、部分的に信頼された呼び出し元の例外からのスタック トレースです。

"That assembly does not allow partially trusted callers."
at proto_4(Object , ProtoReader )
   at ProtoBuf.Serializers.CompiledSerializer.ProtoBuf.Serializers.IProtoSerializer.Read(Object value, ProtoReader source)
   at ProtoBuf.Meta.RuntimeTypeModel.Deserialize(Int32 key, Object value, ProtoReader source)
   at ProtoBuf.ProtoReader.ReadTypedObject(Object value, Int32 key, ProtoReader reader, Type type)
   at ProtoBuf.ProtoReader.ReadObject(Object value, Int32 key, ProtoReader reader)
   at proto_2(Object , ProtoReader )
   at ProtoBuf.Serializers.CompiledSerializer.ProtoBuf.Serializers.IProtoSerializer.Read(Object value, ProtoReader source)
   at ProtoBuf.Meta.RuntimeTypeModel.Deserialize(Int32 key, Object value, ProtoReader source)
   at ProtoBuf.Meta.TypeModel.DeserializeCore(ProtoReader reader, Type type, Object value, Boolean noAutoCreate)
   at ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type, SerializationContext context)
   at ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type)
   at ProtoBuf.Serializer.Deserialize[T](Stream source)
   at BinarySerializationTest.Form1.button1_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at BinarySerializationTest.Program.Main()
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
4

1 に答える 1

0

面白い。私は部分的な信頼の設定についてはあまり行っていませんが、スタックトレースが爆発したとき(そしてどこから呼び出しているのか-つまり、serializeを呼び出すアセンブリがdeserializeを呼び出すアセンブリと異なるかどうか)を教えていただければ、それを機能させるために、いくつかの場所にいくつかを追加できる可能性があります[AllowPartiallyTrustedCallers]

コンパイル前のルートは私の他の提案でしたが、スタンドアロンアセンブリでのアクセス可能性がより厳密であるため、実際にはこれはプライベートフィールドでは機能しません。

3番目のオプションは、影響を受けるprivateフィールドをフィールドにし、それらのフィールドにアクセスできるようにするためにinternal使用することです。次に、「プリコンパイラ」を使用します。[assembly:InternalsVisibleTo("NameOfGeneratedAssembly)]これにより、フィールドにアクセスできるようになり、r602以降(執筆時点での最新のビルド)でサポートされます。

于 2012-11-19T07:39:53.227 に答える