Должна ли десериализация List <> из .Net 2 работать в .Net 4? - PullRequest
4 голосов
/ 23 августа 2011

При выполнении удаленного вызова из приложения .Net 4 в приложение .Net 2 я получаю следующую ошибку.

Невозможно загрузить тип System.Collections.Generic.List`1 [[MyNamespace.MyClass, MyAssembly, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null]] требуется для десериализации.

Кто-нибудь знает, может ли это быть вызвано тем, что List<T> отличается в .Net 2 и .Net 4?

Кроме того, MyClass имеет свойства 3 string и 3 DateTime и помечен как [Serializable], но не реализует ISerializable

Вот трассировка стека:

Трассировка стека серверов:
at System.Runtime.Serialization.ObjectManager.CompleteObject (держатель ObjectHolder, логическое значение bObjectFullyComplete)
в System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups (держатель ObjectHolder)
в System.Runtime.Serialization.ObjectManager.RegisterObject (Объектный объект, Int64 objectID, информация SerializationInfo, Int64 idOfContainedObj, член MemberInfo, Int32 [] arrayIndex)
в System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject (объектный объект, ParseRecord pr, ParseRecord objectPr, логический bIsString)
в System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEnd (ParseRecord pr)
в System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run ()
в System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (обработчик HeaderHandler, __BinaryParser serParser, логический fCheck, логический isCrossAppDomain, IMethodCallMessage methodCallMessage IMethodCallMessage)
в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (поток serializationStream, обработчик HeaderHandler, логический fCheck, логический isCrossAppDomain, IMethodCallMessage methodCallMessage)
в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (поток serializationStream, обработчик HeaderHandler, логический fCheck, метод IMethodCallMessageCallMessage)
в System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage (IMessage msg) Возникло исключение в [0]:
в System.Activities.Statements.Throw.Execute (контекст CodeActivityContext)
в System.Activities.CodeActivity.InternalExecute (экземпляр ActivityInstance, исполнитель ActivityExecutor, BookmarkManager bookmarkManager)
в System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody (Исполнитель ActivityExecutor, BookmarkManager bookmarkManager, Местоположение resultLocation)

Ответы [ 4 ]

2 голосов
/ 23 августа 2011

MyClass сериализуется с использованием BinaryFormatter.См. http://devolutions.net/articles/dot-net/Net-Serialization-FAQ.aspx#S11

BinaryFormatter не очень хорошо работает при сериализации и десериализации между версиями .NET Framewok.

Некоторые другие параметры хорошо описаны ниже: Независимая от сборки сериализация в.NET

РЕДАКТИРОВАТЬ 1 (из комментария): В случае удаленного взаимодействия .NET существуют метаданные, которые сопровождают маршалинг данных.Я предполагаю, что проблема может быть вызвана тем фактом, что метаданные зависят от сборок CLR, поэтому различия в объекте List <> между .NET 2 и .NET 4 могут вызывать проблему, которую вы изначально предполагали.У меня нет опыта в этом, но надеюсь, что это может помочь.

2 голосов
/ 23 августа 2011

Кажется, проблема в загрузке вашего типа:

MyNamespace.MyClass, MyAssembly

.NET Framework должен загрузить тип T в List<T>, чтобы иметь возможность сериализации списка. Так что проблема в том, что ваша сборка или ваш тип неправильно загружены в другой узел.

Вы должны провести свою работу, чтобы понять, почему машина, которая выдает ошибку, не может загрузить сборку, содержащую тип MyNamespace.MyClass, MyAssembly

Кроме того, убедитесь, что тип MyNamespace.MyClass, MyAssembly имеет тот же номер версии.

Вы можете увидеть сбои загрузки сборки с помощью инструмента Fusion Log . Надеюсь, это поможет.

0 голосов
/ 14 июля 2017

Понятно, это старый пост ... У меня просто было что-то похожее:

Я пытался сериализовать класс как:

<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

Получил ту же проблему. без подробностей о настройке Binder на deseriaze ( см. здесь ), для меня решение заключалось в том, чтобы заключить список в сериализуемый класс, например:

<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 на:

<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, Daniel

PS: извините за VB:)

0 голосов
/ 31 августа 2011

Ну, я все перепробовал, но ничего не получалось.Он был запущен из агента сборки TFS, поэтому отладка была невозможна.В конце концов я использовал сериализацию результатов Xml, чтобы обойти проблему.

...