- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好,
我尝试将 .NET Framework 控制台应用程序移植到 .NET Core 3.0。但是当我启动核心版本时,我在反序列化二进制文件时遇到异常。
此二进制文件是在另一个 .NET Framework 程序中使用 BinaryFormatter 类通过对象序列化创建的。
为了反序列化它,我引用了包含序列化类的 DLL。所以从控制台应用程序中截取的代码是:
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
EthCatalog = (EthernetCatalog)formatter.Deserialize(stream);
EthernetCatalog 来自引用的 DLL。我得到的异常(exception)是:
System.Runtime.Serialization.SerializationException: 'Type 'System.Net.IPAddress' in Assembly 'System.Net.Primitives, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.'
显然在 EthernetCatalog 类的某处使用了 IPAddress 类。此类在 .NET Framework 中可序列化,但在 .NET Core 中不可序列化。
所以我的第一个问题是你能做到这一点吗?尽管 EthernetCatalog 类是在 .NET Framework DLL 中定义的,但我可以在 .NET Core 中反序列化包含 EthernetCatalog 对象的文件吗?比如告诉 Deserilized 只是将所有无法反序列化的内容设置为 null?
在调查这个问题时,我实际上变得更加困惑,并且出现了更多问题:
提前致谢!
最佳答案
- Why is the .NET Framework DLL containing the EthernetCatalog class even using the IPAddress class from .NET Core?
事实并非如此。 .NET 具有类型转发功能,可以使用其旧的 .NET Framework 标识解析类型。随时检查 .NET Core 程序集(路径类似于 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.0.0
),您会发现 System.dll
甚至在 .NET Core 中(IPAddress
位于 .NET Framework 中)。但是尝试反汇编它,你会发现它不包含任何类型,而是一堆程序集属性。其中:
[assembly: TypeForwardedTo(typeof(IPAddress))]
其中 IPAddress
引用该类型在 System.Net.Primitives
程序集中的新位置。这就是您收到有关新身份的错误消息的原因。
- Is the attribute [System.Serializable] not used anymore in .NET Core?
是的,但是许多在 .NET Framework 中可序列化的类在 .NET Core 中不再可序列化(委托(delegate)、类型、反射成员、流、编码、文化信息等)。具有讽刺意味的是,类型转发机制是支持序列化的,特别是 BinaryFormatter
机制,但似乎有一些类型不再可序列化,但它们仍然被转发。
可能的解决方案:
根据经验,如果您需要跨平台序列化对象,您应该更喜欢一些基于文本的序列化,例如 XML 或 JSON。
但即使您确实需要使用 BinaryFormatter
反序列化遗留流,也有一些可能的解决方法。
BinaryFormatter
的SurrogateSelector
属性来自定义某些类型的反序列化。如果您使用我的 CustomSerializerSurrogateSelector 可能是最简单的解决方案,正是为了这个目的。来自其文档:// deserializing a MemoryStream in .NET Core that was serialized in .NET Framework
var formatter = new BinaryFormatter { SurrogateSelector = new CustomSerializerSurrogateSelector() };
var memoryStream = (MemoryStream)formatter.Deserialize(streamSerializedInNetFramework);
如您所见,我将它用于MemoryStream
,但它也应该以同样的方式用于IPAddress
。您可以从 nuget 下载库。
Binder
属性的 SerializationBinder
:将 IPAddress
重定向到自定义可序列化类,应实现 IObjectReference
。您必须实现 GetRealObject
方法,该方法必须返回正确的 IPAddress
实例。关于c# - 在 .NET Core 3 中反序列化使用 .NET Framework 创建的二进制文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61455857/
我目前正在对一个 mmorpg 的二进制网络协议(protocol)进行逆向工程。我正在用 java 实现该协议(protocol)。 对于每个数据包类型,我将创建一个表示二进制数据的类。 例如,聊天
我正在尝试围绕现有类编写半透明包装器,我希望它能够模仿其他类的序列化。 例如,给定以下类: class Foo { [JsonConverter(CustomConverter)] s
是否有使用 Jackson 序列化和反序列化枚举集的简单方法? private enum Type { YES, NO } @JacksonXmlProperty(localName = "t
我很想知道当我们反序列化一个对象时会发生什么。 例如,如果我的类对象由许多其他对象组成,对象创建过程如何在反序列化过程中发生 最佳答案 对象是用默认的初始化字段创建的,然后用从串行流中获取的属性值填充
我正在尝试序列化和反序列化(使用 QDataStream 但这与这里无关)一个 enum class变量: enum class Type : char { Trivial, Comp
我不确定这到底有什么问题...它不会为我编译,我将它从 c 翻译成 C++(或尝试)...是的,我是初学者。谢谢! #include #include using namespace std; i
我遇到的问题与此处描述的问题非常相似:Combining type and field serializers case class(id: Option[UUID], otherValue:Stri
我们知道base中的apply()可以对数组的边距应用一个函数,边距应该是行或列。我想将边距扩大到“对角线” 和“反对角线”。结构看起来像 diagApply <- function(x, FUN,
我找到了 JSON serialization and deserialization to objects in Flutter 的例子但是如何使用像这样的人员列表来做到这一点: [ {
我有一个相当大的terms聚合结果,这些结果被加载到下拉列表中以提供filter功能。 可以说,我的下拉列表中有4000多种动物。我的另一个下拉列表有4种动物颜色。 例, animal --> ["d
我需要将 C# (.NET Framework 4.5.2) 中的一个类与 XML 序列化(反序列化),该类具有 string 的字典属性。键和 string[]数组值。我正在使用 Serializa
[已解决]应用给定的解决方案,效果很好! 程序的目的:在用户打开和关闭程序时保存/重新加载以前的数据。 我曾经用一个对象(obj)成功(反)序列化,现在我有两个不同类的不同对象。 我试图通过查看其他帖
问题 假设我有一个代表某事或其他的枚举: public enum ResultState { Found, Deleted, NotFound } 在我的序列化 json 中,
是否有取消 JSON 字符串的功能?我猜它不会内置到 JQuery 中,但它可以通过编写一个操纵字符串的脚本来实现吗?我在下面遇到了这个问题。 我正在使用 NYTimes API,但它不支持 JSON
对于这个问题,假设当对象完全写入流并成功读出时,或者当对象部分写入流并且读回对象时发生异常时,序列化/反序列化是原子的。假设写操作可能无法成功完成,例如因为停电了。 在Serializable的描述中
有谁知道时序检查是否仍在检测虚拟环境?我尝试使用 rdtsc 指令来获取 cpu 周期并比较真实 linux 机器和在 virtualbox 上运行的 linux 之间的结果。但结果似乎不稳定。有时,
我正在对一个(外部给定的)XML 文件进行操作,该文件具有以下形式的元素 10 20 30 40 50 60 70 80 我知道如何将属性作为属性处理(通过使用 [XmlAttri
我有一个通用的序列化器和反序列化器,用于通过网络连接发送的消息: public static async Task SerializeObject(Object obj) {
我正在考虑将当前基于 WCF 的应用程序迁移到 protobuf-net.Grpc。这似乎是可行的,但是我无法在不包含所有具有 [ProtoInclude] 属性的派生类的情况下使(DTO 类)基类的
我正在尝试将一些数据保存到文件中,但文件保存到的目录不正确。 using (StreamWriter sw = new StreamWriter(dir + "\\temp" + x + ".txt"
我是一名优秀的程序员,十分优秀!