在.NET Core 3中序列化MemoryStream抛出异常,求解决方案
解决.NET Core 3中MemoryStream序列化的SerializationException问题
嘿,这个问题我太熟悉了!咱们先搞清楚为什么会报错,再一步步解决它。
问题根源
你看到的异常核心原因是:在.NET Core 3+版本中,System.IO.MemoryStream类不再标记[Serializable]属性,但你从资源文件中获取的LayoutStream是一个被序列化的MemoryStream对象(大概率是用.NET Framework序列化的,因为旧框架里的MemoryStream支持序列化)。当你在.NET Core环境下尝试反序列化这个对象时,BinaryFormatter就会抛出这个“类型未标记可序列化”的异常。
解决方案
根据你的场景,有两种可行的处理方式:
方案1:重新生成资源文件(推荐)
如果这个资源文件是你自己维护的,那最优解是放弃直接序列化MemoryStream,转而序列化它的字节数组:
- 序列化阶段(不管是.NET Framework还是.NET Core环境):
// 将MemoryStream的内容转换成字节数组 byte[] streamContent = mystream.ToArray(); // 把streamContent存入资源文件,替换原来的LayoutStream - 反序列化阶段(.NET Core 3+环境):
// 从资源中取出字节数组 byte[] streamContent = (byte[])resources.GetObject("LayoutStreamBytes"); // 用字节数组重建MemoryStream using (MemoryStream mystream = new MemoryStream(streamContent)) { // 这里编写你后续的业务逻辑 }
方案2:处理已有的资源文件(无法重新生成时)
如果资源文件是第三方提供的、没法重新生成,那可以用一个变通方法:
- 先在.NET Framework项目中反序列化这个
LayoutStream,得到完整的MemoryStream对象后导出它的字节数组。 - 将导出的字节数组重新存入资源文件,再用方案1的方法在.NET Core项目中使用。
这种方式虽然绕了一步,但能快速兼容现有资源文件。
额外提醒
.NET Core团队移除MemoryStream的序列化支持是有意为之的——流对象的状态和底层缓冲区深度绑定,直接序列化容易导致不可预期的行为。所以以后尽量避免序列化流本身,优先序列化流的内容(字节数组)会更稳妥。
内容的提问来源于stack exchange,提问作者Magesh Maggi




