是否应该反序列化列表<>从.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)
似乎问题是加载你的类型:
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:)