2011-08-23 7 views
3

.Net 4アプリケーションから.Net 2アプリケーションへのリモート呼び出しを行うときに、次のエラーが発生します。タイプ System.Collections.Generic.List`1ロードできません リスト2をデシリアライズする必要があります。

[MyNamespace.MyClassを MyAssembly、バージョン= 1.0.0.0、文化=中立、 なPublicKeyToken = NULL]]デシリアライズするために必要。

List<T>が.Net 2と.Net 4で異なるため、これが発生する可能性があるかどうかは知りませんか?

サーバースタックトレース:

また、MyClassは3つのstringと3 DateTime特性を有し、[Serializable]としてマークされますがISerializable

を実装していません。ここでスタックトレースですSystem.Runtimeで
。 Serialization.ObjectManager.CompleteObject(ObjectHolder holder、Boolean bObjectFullyComplete)
at System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolder ho lder)System.Runtime.Serialization.ObjectManager.RegisterObject(オブジェクトobj、Int64のオブジェクトID、たSerializationInfo情報、Int64のidOfContainingObj、のMemberInfo部材のInt32に
[] arrayIndex)System.Runtime.Serialization.Formatters.Binary.ObjectReaderで
。 RegisterObject System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEndで(オブジェクトobj、ParseRecordのPR、ParseRecord objectPr、ブールbIsString)
(ParseRecord PR)
System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Runで()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandlerハンドラ、__BinaryParser serParser、ブールfCheck、ブール値isCrossAppDomain、IMethodCallMessage methodCallMessa System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.DeserializeでGE)System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(ストリームserializationStream、HeaderHandlerハンドラ、ブールはFCheck、ブールisCrossAppDomain、IMethodCallMessage methodCallMessage)で

(ストリームserializationStream、HeaderHandlerハンドラ、ブールはFCheck、IMethodCallMessage methodCallMessage)で 再スローSystem.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessageで
(IMessageがMSG)例外[0]:System.Activities.Statements.Throwで
。 Execute(CodeActivityContextコンテキスト)
at System.Activities.CodeActivity.InternalExecute(ActivityInstance insタンス、ActivityExecutorエグゼキュータ、BookmarkManager bookmarkManager)System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBodyで
(ActivityExecutorキュータ、BookmarkManager bookmarkManager、場所resultLocation)

+0

申し訳ありませんが型自動シリアライズされた、または手動の実装ですか? –

+0

これは自動シリアル化されています。 – DaveShaw

答えて

0

私はすべてを試しましたが、何も効果がありませんでした。これはTFSビルドエージェント内から起動されたので、デバッグはできませんでした。最後に、問題の回避策として、結果のXmlシリアル化を使用しました。私のようなクラスをシリアル化しようとした

<Serializable> 
Public Class MyClass 
    public Property Name as String 

    Private _Items as List(Of MyClass) 
    Public Property Items as List(Of MyClass) 
     Get ... 
     Set ... 
    End Property 

End Class 

は同じ問題を手に入れた

私が見る
1

問題があなたのタイプをロードしているようだ。

MyNamespace.MyClass, MyAssembly 

リストをシリアル化できるようにするには、.NETフレームワークでタイプTをList<T>にロードする必要があります。だから問題は、あなたのアセンブリ、またはあなたのタイプが正しく他のピアに読み込まれていないことです。

あなたはタイプMyNamespace.MyClass, MyAssemblyは、同じバージョン番号を持っていることを確認、エラーを投げているマシンは種類もMyNamespace.MyClass, MyAssembly

を含むアセンブリをロードすることはできません理由を理解するためにあなたの作業を実施すべきです。

Fusion Log toolを使用すると、アセンブリの読み込みに失敗することがあります。それが役に立てば幸い。

+0

チップをありがとう。私は明日、サービスを提供している開発者と一緒にこれを拾う必要があります。 – DaveShaw

2

MyClassはBinaryFormatterを使用してシリアル化されています。 http://devolutions.net/articles/dot-net/Net-Serialization-FAQ.aspx#S11

.NET Framewokのバージョン間でシリアル化とデシリアライズを行うと、BinaryFormatterがうまく再生されません。

いくつかの他のオプションは以下にも記載されている:(コメントから)Assembly Independent Serialization in .NET

EDIT 1:.NETリモートの場合は、データのマーシャリングと一緒に行くのメタデータがあります。私は、この問題は、メタデータがCLRアセンブリに依存しているため、.NET 2と.NET 4の間のList <オブジェクトの違いが、元々想定していた問題を引き起こしている可能性があることを前提としています。私はこれに経験はないが、助けてくれることを望む。

+0

私は2つのシンプルなアプリケーションを使って、最初のリンクからのコードを使用してバイナリをシリアライズし、.Net2のリストをシリアル化し、.Net4で逆直列化して動作させます。 – DaveShaw

+0

@DaveShaw [OK]を、あなたの状況は、その特定の問題に該当しない可能性があります。私の経験は.net 4でシリアライズしており、以前のフレームワークにデシリアライズしてこの問題を受け取りました。あなたは他の方法を行っています、そして、あなたのオブジェクトは問題を引き起こさないほど簡単です。あなたは遠隔操作しているので、私は私の答えにもっと追加します。 – bencobb

0

、これは古い記事です...私はちょうど似た何かを持っていました。 、

<Serializable> 
Public Class MyClass 
public Property Name as String 

Private Property _Items as ListOfMyClass 
Public Property Items as ListOfMyClass 
    Get ... 
    Set ... 
End Property 

End Class 

BR:/ deseriazeにバインダーを設定に関する詳細(See Here)O私のためのソリューションのような直列化可能クラスのリストをカプセル化することだったのw:

<Serializable> 
Public Class ListOfMyClass 
Inherits List(Of MyClass) 
Sub New() 
    MyBase.New() 
End Sub 

Sub New(col As IEnumerable(Of MyClass)) 
    MyBase.New(col) 
End Sub 

Sub New(cap As Integer) 
    MyBase.New(cap) 
End Sub 
End Class 

そして最後にはMyClassを変更 ダニエル

PS:VB :)

関連する問題