【问题标题】:Should Deserializing a List<> from .Net 2 work in .Net 4?应该从 .Net 2 反序列化 List<> 在 .Net 4 中工作吗?
【发布时间】:2011-08-23 15:27:32
【问题描述】:

从 .Net 4 应用程序向 .Net 2 应用程序进行远程调用时出现以下错误。

无法加载类型 System.Collections.Generic.List`1[[MyNamespace.MyClass, MyAssembly,版本=1.0.0.0,文化=中性, 反序列化需要 PublicKeyToken=null]]。

有谁知道这是否可能是因为List&lt;T&gt; 在 .Net 2 和 .Net 4 中不同?

另外,MyClass 有 3 个string 和 3 个DateTime 属性并被标记为[Serializable],但没有实现ISerializable

这是堆栈跟踪:

服务器堆栈跟踪:
在 System.Runtime.Serialization.ObjectManager.CompleteObject(ObjectHolder 持有者,布尔 bObjectFullyComplete)
在 System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolder 持有者)
在 System.Runtime.Serialization.ObjectManager.RegisterObject(对象 obj,Int64 objectID,SerializationInfo 信息,Int64 idOfContainingObj,MemberInfo 成员,Int32[] arrayIndex)
在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject(对象 obj,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)
在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流序列化流,HeaderHandler 处理程序,布尔 fCheck,布尔 isCrossAppDomain,IMethodCallMessage methodCallMessage)
在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流序列化流,HeaderHandler 处理程序,布尔 fCheck,IMethodCallMessage methodCallMessage)
在 System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg) 重新抛出异常 在 [0]:
在 System.Activities.Statements.Throw.Execute(CodeActivityContext 上下文)
在 System.Activities.CodeActivity.InternalExecute(ActivityInstance 实例,ActivityExecutor 执行器,BookmarkManager 书签管理器)
在 System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor 执行器, BookmarkManager bookmarkManager, Location resultLocation)

【问题讨论】:

  • 类型是自动序列化的,还是手动实现的?

标签: c# serialization remoting


【解决方案1】:

似乎问题在于加载您的类型:

MyNamespace.MyClass, MyAssembly

.NET 框架需要在List&lt;T&gt; 中加载类型 T 才能序列化列表。所以问题是您的程序集或您的类型未正确加载到其他对等方中。

您应该了解为什么抛出错误的机器无法加载包含MyNamespace.MyClass, MyAssembly 类型的程序集

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

您可以使用Fusion Log tool 查看程序集加载失败。希望对您有所帮助。

【讨论】:

  • 感谢您的提示。明天我必须与托管服务的开发人员一起解决这个问题,因为他今天很烦人。
【解决方案2】:

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

BinaryFormatter 在 .NET Framewok 版本之间进行序列化和反序列化时效果不佳。

下面对其他一些选项进行了很好的描述:Assembly Independent Serialization in .NET

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

【讨论】:

  • 我拼凑了 2 个简单的应用程序,使用第一个链接中的代码在 .Net2 中对 List 进行二进制序列化并在 .Net4 中反序列化它,它可以工作。
  • @DaveShaw 好的,看来您的情况可能不属于该特定问题。我的经验是在 .net 4 中序列化并反序列化到我收到此问题的早期框架。你走的是另一条路,你的对象可能很简单,不会引起问题。您正在远程处理,所以我会在我的答案中添加更多内容。
【解决方案3】:

好吧,我尝试了所有方法,但没有任何效果。这是从 TFS 构建代理中启动的,因此无法进行调试。最后我使用了结果的 Xml 序列化来解决这个问题。

【讨论】:

    【解决方案4】:

    我明白了,这是一篇旧帖子......我刚刚有类似的东西:

    我试图序列化一个类,如:

    <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
    

    遇到同样的问题。没有关于在反序列化 (See Here) 上设置 Binder 的详细信息,我的解决方案是将列表封装在可序列化的类中,例如:

    <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 :)

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多