Mirror框架内部类序列化:InternalsVisibleToAttribute权限问题求助
Mirror自定义序列化器内部类访问权限问题解决
问题描述
我正尝试按照Mirror官方文档为自定义类型编写序列化器,想知道是否可以用InternalsVisibleToAttribute将内部类暴露给Mirror程序集,让它能访问我的自定义数据类型和序列化器。
我做了如下尝试:
[assembly:InternalsVisibleTo("Mirror")] [assembly:InternalsVisibleTo("Mirror.Authenticators")] [assembly:InternalsVisibleTo("Mirror.CompilerSymbols")] [assembly:InternalsVisibleTo("Mirror.Components")] [assembly:InternalsVisibleTo("Mirror.Editor")] [assembly:InternalsVisibleTo("Mirror.Transports")] [assembly:InternalsVisibleTo("Unity.Mirror.CodeGen")] namespace MyNamespace.InternalStuff { [Serializable] internal class MyInternalClass { // ... } }
但一直抛出以下异常:
MethodAccessException: Method `MyNamespace.InternalStuff.MyInternalClassSerializer.WriteItem(Mirror.NetworkWriter,MyNamespace.InternalStuff.MyInternalClass)' is inaccessible from method `Mirror.GeneratedNetworkCode.InitReadWriters()'
(不清楚该异常所属的程序集)。我之前用同样的方式通过InternalsVisibleToAttribute把这些类暴露给单元测试程序集是成功的。
解决方案
核心原因
你漏掉了对Mirror动态生成的Mirror.GeneratedNetworkCode程序集的可见性授权,而异常里的InitReadWriters()方法正是属于这个程序集。
修复步骤
- 在程序集级别的
InternalsVisibleTo属性中新增以下行:
[assembly:InternalsVisibleTo("Mirror.GeneratedNetworkCode")]
- 确保你的
MyInternalClassSerializer类是内部类,并且它的WriteItem、ReadItem等序列化方法为internal修饰符(如果是private则无法被授权访问)。
补充说明
Mirror的代码生成流程会自动创建Mirror.GeneratedNetworkCode程序集,用来存放网络读写逻辑的初始化代码。你的自定义序列化器方法必须被这个程序集访问,才能完成网络数据的序列化注册。之前单元测试成功是因为你正确授权了测试程序集,但没覆盖到这个动态生成的核心程序集。
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

