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
相关产品推荐
相关产品推荐

