2011-08-23 3 views
3

.Net 4 응용 프로그램에서 .Net 2 응용 프로그램으로 원격 호출을 할 때 다음 오류가 발생합니다. 타입 System.Collections.Generic.List`1로드 할 수 없습니다 .Net에서 List <>를 Deserializing해야합니다 .Net 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 홀더, 부울 bObjectFullyComplete) System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups에서
(해, ObjectHolder 호 lder) System.Runtime.Serialization.ObjectManager.RegisterObject (객체 (OBJ), INT64 objectID에, 정보를 SerializationInfo, INT64 idOfContainingObj, MemberInfo가 부재 INT32에서
[] arrayIndex) System.Runtime.Serialization.Formatters.Binary.ObjectReader에서
. RegisterObject (개체 OBJ, ParseRecord 홍보, ParseRecord objectPr, 부울 bIsString) System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEnd에서
(ParseRecord 홍보)
System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run에서() System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (HeaderHandler 핸들러 __BinaryParser serParser 부울 fcheck가 부울 isCrossAppDomain, IMethodCallMessage methodCallMessa에서
GE) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (스트림 serializationStream, HeaderHandler 핸들러, 부울 fcheck가, 부울 isCrossAppDomain, IMethodCallMessage methodCallMessage)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize에서에서
(트림 serializationStream, HeaderHandler 핸들러 부울 fcheck가, IMethodCallMessage methodCallMessage)에서 재 throw System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage에서
(iMessage를 MSG) 예외 [0]에 System.Activities.Statements.Throw
. 실행 (CodeActivityContext 컨텍스트) System.Activities.CodeActivity.InternalExecute에서
(ActivityInstance의 인 tance, ActivityExecutor 실행자, BookmarkManager bookmarkManager는) System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody (ActivityExecutor 실행기, BookmarkManager bookmarkManager, 위치 resultLocation)에서

+0

에 대한 죄송 유형 자동 직렬화 또는 수동 구현인가? –

+0

자동으로 일련 번호가 지정됩니다. – DaveShaw

답변

0

음, 모든 것을 시도했지만 아무 것도 효과가 없었습니다. 이것은 TFS Build Agent 내에서 시작되었으므로 디버깅은 불가능했습니다. 결국 나는 Xml Serialization을 사용하여 문제를 해결했다.

내가 같은 클래스를 직렬화하려고 :

<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 프레임 워크는 목록을 serialize 할 수 있도록 List<T>에 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 원격의 경우, 데이터의 마샬링와 함께 간다 메타 데이터가있다. 문제는 .NET Framework 2와 .NET 4 사이의 List < 개체의 차이가 원래 가정했던 문제의 원인 일 수 있기 때문에 메타 데이터가 CLR 어셈블리에 의존한다는 사실에 기인한다고 생각합니다. 나는이 경험이 없지만 도움이 될 수 있기를 바랍니다.

+0

두 개의 간단한 응용 프로그램을 두 번 해보았습니다. 첫 번째 링크의 코드를 사용하여 .Net2의 목록 을 이진 직렬화하고 .Net4에서 비 직렬화하면 작동합니다. – DaveShaw

+0

@DaveShaw 네, 상황이 특정 문제에 해당되지 않을 수도 있습니다. 내 경험은 .net 4에서 직렬화하고 이전 프레임 워크로이 문제를 수신했습니다. 당신은 다른 길로 가고있어, 당신의 물건은 문제를 일으키지 않을 정도로 단순 할 수 있습니다. 당신은 리모트하고있어, 그래서 나는 내 대답에 더 많은 것을 추가 할 것이다. – bencobb

0

이 난 그냥 비슷한했다 ... 이전 게시물입니다.

<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에에 : deseriaze에 바인더 (See Here를) 설정에 대한 자세한 O/ME에 대한 솔루션이 같은 직렬화 클래스의 목록을 캡슐화하는 것이었다 승

<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을, 다니엘

PS : VB :

관련 문제