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

Windows Forms中C#引用音频资源报错:MemoryStream未标记可序列化

解决.resx音效资源引用的序列化异常问题

问题原因

你遇到的SerializationException是因为.NET Core/.NET 6+中MemoryStream未标记为可序列化,而自动生成的Properties.Resources代码尝试通过序列化方式读取资源(通常是因为资源被错误地以二进制类型存储)。给自定义类加[Serializable]特性没用,因为异常根源是系统类MemoryStream无法被修改。

解决方法

1. 重新正确添加音效资源

在Visual Studio中操作:

  • 右键.resx文件 → 添加现有项,选择你的音效文件(如.wav)。
  • 在属性窗口中设置:
    • 生成操作:嵌入的资源
    • 类型:选择System.Media.SoundPlayer, System.Windows.Extensions(或对应音频类型,不要选“二进制”)
  • 重新生成项目,此时调用Properties.Resources.correct_config会返回正确的音频对象,不会触发序列化异常。

2. 手动通过程序集获取资源流

如果自动生成的资源代码仍有问题,可绕过Properties.Resources,直接从程序集读取嵌入资源:

using System.Reflection;
using System.Media;

// 替换为你的项目命名空间和完整资源文件名(含后缀)
var resourceName = "YourProjectNamespace.Properties.Resources.correct_config.wav";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
    if (stream != null)
    {
        using (var soundPlayer = new SoundPlayer(stream))
        {
            soundPlayer.Play();
        }
    }
}

3. 检查自动生成的Resources代码

打开Properties/Resources.Designer.cs,找到correct_config属性的getter方法。如果代码中使用了BinaryFormatter(比如通过ResourceManager.GetObject后做二进制反序列化),说明资源类型设置错误,按照方法1重新添加资源即可解决。

内容的提问来源于stack exchange,提问作者Jesús Rotonda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:56:13