ASP.NET替换过时BinaryFormatter为XmlSerializer序列化字符串输出异常
问题原因
你的代码无法得到正确结果,主要有3个核心问题:
- 两种序列化器的输出格式完全不兼容:
BinaryFormatter输出的是带.NET专属类型元数据的私有二进制格式,XmlSerializer输出的是标准XML文本格式,二者没有任何互操作性。如果你期望XmlSerializer输出和旧代码BinaryFormatter完全一致的字节内容,从设计上就不可能实现。 - MemoryStream API 使用错误:
ms.GetBuffer()返回的是内存流底层分配的全量缓冲区,其中包含大量未写入实际内容的填充冗余字节,无论使用哪种序列化器,都应该调用ms.ToArray()获取实际写入的有效序列化字节。 - XmlSerializer 序列化字符串的输出和预期不符:直接序列化字符串时,
XmlSerializer会自动生成带XML声明、<string>根节点的完整XML文档,比如序列化普通字符串test,输出的字节对应的内容是<?xml version="1.0" encoding="utf-8"?><string>test</string>,不会是你预期的和原字符串直接对应的内容。
修复方案
根据你的实际场景选择对应实现即可:
场景1:仅需序列化字符串内容,不需要兼容旧BinaryFormatter数据、不需要XML格式
这种场景完全不需要使用任何序列化器,直接用编码转换即可,性能更高、逻辑更简单:
// 序列化 return System.Text.Encoding.UTF8.GetBytes(Content); // 对应反序列化逻辑 // var content = System.Text.Encoding.UTF8.GetString(serializedBytes);
场景2:确实需要使用XML格式序列化内容
修正MemoryStream的API调用即可,注意如果序列化的是自定义类型,需要保证该类型有公共无参构造函数、公共可读写属性,否则XmlSerializer会抛出异常:
// 明确指定序列化类型为string,比运行时调用GetType()更稳妥 XmlSerializer xmlSerializer = new XmlSerializer(typeof(string)); using (MemoryStream ms = new MemoryStream()) { xmlSerializer.Serialize(ms, Content); // 替换GetBuffer为ToArray,获取有效序列化字节 var SerializedContent = ms.ToArray(); return SerializedContent; }
注意:如果你的业务需要兼容历史上用BinaryFormatter序列化生成的旧数据,XmlSerializer无法实现这个需求,二者格式完全不互通。建议先做旧数据迁移,后续不要再使用BinaryFormatter相关的逻辑,该组件存在已知的严重安全漏洞,微软已明确禁止在生产环境使用。
内容的提问来源于stack exchange,提问作者schwifty
相关产品推荐
相关产品推荐

