You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:17:02