这是我的代码:
using ProtoBuf;
[ProtoContract]
[ProtoInclude(500, typeof(SampleClassDrv))]
public class SampleClass
{
[ProtoMember(1)] public int theInt;
[ProtoMember(2)] public string[] items;
public SampleClass(){}
public SampleClass(int c) {this.theInt = c;}
}
[ProtoContract]
public class SampleClassDrv : SampleClass
{
[ProtoMember(1)] public int theOtherInt;
public SampleClassDrv(){}
public SampleClassDrv(int b):base(1){this.theOtherInt=b;}
}
要编译我的DLL,我运行以下代码:
RuntimeTypeModel rModel = TypeModel.Create();
rModel.AllowParseableTypes = true;
rModel.AutoAddMissingTypes = true;
rModel.Add(typeof(SampleClass), true);
rModel.Add(typeof(SampleClassDrv), true);
rModel.Compile("MySerializer", "MySerializer.dll");
最后我应该可以通过dll中的RuntimeTypeModel进行初始化,如下所示:
MySerializer serializer = new MySerializer();
serializer.Serialize(stream, object);
但是Unity会引发以下异常
Internal compiler error. See the console log for more information.
[...]
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
有趣的是,如果我回去删除该行
[ProtoMember(2)] public string[] items;
按预期工作......
值得注意的是,如果在添加类而不是尝试使用dll之后使用RunTimeModel,则可以按预期工作。
我的环境:
如果有人能以我的方式指出错误,我将不胜感激。
修改
根据Flamy的建议,我将表单字符串[]更改为List
[ProtoMember(2)] public List<string> items;
可悲的是,错误仍然存在。
另一个注意事项
此外,我决定使用dll反编译器来查看发生了什么。在删除“string [] items”变量之前,我无法反编译dll。
解决
我认为这与使用Unity3D编译DLL有些问题有关。
当我使用上面显示的代码在Visual Studios中创建项目时,一切似乎都按预期工作。这是一种解脱,因为如果protobuf无法序列化string[]
,这似乎是一个巨大的问题。
我按照BCCode提供的文章来设置visual studio项目并编译DLL。
现在我需要做的就是用我的大型项目创建dll! 手指交叉
感谢大家的帮助!
答案 0 :(得分:1)
您的参考文献是否正确? %project目录%\ Library \ ScriptAssemblies \ Assembly-CSharp.dll
另请看这里: http://purdyjotut.blogspot.com/2013/10/using-protobuf-in-unity3d.html?m=1
答案 1 :(得分:0)
使用二进制血清化或使用二进制格式(在这种情况下为protobuff)的血清化方法来串联字符串将始终导致许多问题。原因是String本身就是一个字符数组,它没有定义的大小,这意味着它不知道一个字符串的结束位置和下一个字符串的开始...通常我们逐个序列化字符串数组而不是整个数组。所以我建议你使用一个属性(希望protobuff接受属性的属性!)或者创建一个字符串列表(虽然我还没有测试它应该工作!)