是否应该反序列化列表<>从.net 2到.net 4

本文关键字:net 反序列化 列表 是否 | 更新日期: 2023-09-27 18:06:22

当从。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

下面是堆栈跟踪:

服务器堆栈跟踪:
在System.Runtime.Serialization.ObjectManager。CompleteObject(objecholder, Boolean bObjectFullyComplete)
在System.Runtime.Serialization.ObjectManager。DoNewlyRegisteredObjectFixups (ObjectHolder持有人)
在System.Runtime.Serialization.ObjectManager。RegisterObject(Object obj, Int64 objectID, SerializationInfo info, Int64 idOfContainingObj, MemberInfo member, Int32[] arrayIndex)
在System.Runtime.Serialization.Formatters.Binary.ObjectReader。RegisterObject(Object obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString)
在System.Runtime.Serialization.Formatters.Binary.ObjectReader。ParseObjectEnd (ParseRecord pr)
在System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run ()
在System.Runtime.Serialization.Formatters.Binary.ObjectReader。反序列化(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter。反序列化(流serializationStream, HeaderHandler处理器,布尔fCheck,布尔isCrossAppDomain, IMethodCallMessage methodCallMessage)
在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter。反序列化(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)
在System.Runtime.Remoting.Channels.BinaryClientFormatterSink。SyncProcessMessage(IMessage msg)异常被重新抛出在[0]:
在System.Activities.Statements.Throw。执行(CodeActivityContext上下文)
在System.Activities.CodeActivity。InternalExecute(ActivityInstance实例,ActivityExecutor执行器,BookmarkManager BookmarkManager)
在System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem。ExecuteBody(ActivityExecutor executor, BookmarkManager BookmarkManager, Location resultLocation)

是否应该反序列化列表<>从.net 2到.net 4

似乎问题是加载你的类型:

MyNamespace.MyClass, MyAssembly

. net框架需要在List<T>中加载类型T,以便能够序列化列表。因此,问题是您的程序集或类型没有正确加载到另一个对等体中。

你应该进行你的工作来理解为什么抛出错误的机器不能加载包含MyNamespace.MyClass, MyAssembly

类型的程序集

同时,确保类型MyNamespace.MyClass, MyAssembly具有相同的版本号。

您可以使用Fusion Log工具查看程序集加载失败。

MyClass正在使用BinaryFormatter序列化。看到http://devolutions.net/articles/dot-net/Net-Serialization-FAQ.aspx S11

BinaryFormatter不能很好地在。net框架的不同版本之间进行序列化和反序列化。

下面详细描述了其他一些选项:.NET中独立于程序集的序列化

EDIT 1(来自注释):在. net远程处理的情况下,数据的封送处理伴随着元数据。我假设这个问题可能是由元数据依赖于CLR程序集的事实引起的,因此。net 2和。net 4之间List<>对象的差异可能会导致您最初假设的问题。我没有这方面的经验,但希望能有所帮助。

嗯,我什么都试过了,但都没用。这是从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

有同样的问题。对我来说,解决方案是将列表封装在一个可序列化的类中,如:

<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,丹尼尔

PS:对不起,VB:)