我已经将许多类库从.NET Framework 4.5移植到.NET Standard 2.0。从.NET Framework 4.8控制台应用程序使用这些库可以正常工作。但是,从.NET Core 2.2控制台应用程序引用库会导致以下异常:
SerializationException: Type 'System.Collections.Hashtable+SyncHashtable' in Assembly 'System.Runtime.Extensions, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable
具有堆栈跟踪
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.CheckSerializable(Type t)
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObject(ParseRecord pr)
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse(ParseRecord pr)
at System.Runtime.Serialization.Formatters.Binary.BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
at System.Runtime.Serialization.Formatters.Binary.BinaryParser.Run()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(BinaryParser serParser, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, Boolean check)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
我对失败的框架最内在的调用代码是:
public static object Deserialize(BinaryReader binaryReader)
{
BinaryReader binaryReader = new BinaryReader(inStream);
BinaryFormatter binaryFormatter = new BinaryFormatter();
return binaryFormatter.Deserialize(binaryReader.BaseStream);
}
有什么想法吗?
答案 0 :(得分:0)
Microsoft的答复:“ .NET Core中可二进制序列化的类型少于.NET Framework中的类型。这是设计使然,因为基于BinaryFormatter的序列化历来是脆弱的,并且容易出现安全问题。 SyncHashtable当前无法序列化。但是,我们可能应该这样做。同时,您需要避免对其进行序列化。这可能意味着使用哈希表并手动锁定,而不是使用SyncHashtable。或者可能(高级)使用BinaryFormatter的扩展机制来解决该问题。”
在GitHub上的会话:https://github.com/dotnet/corefx/issues/37708#issuecomment-493641762