Protbuf-net编译为DLL字符串[]导致损坏的DLL

时间:2014-05-08 06:03:40

标签: c# serialization dll unity3d protobuf-net

这是我的代码:

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,则可以按预期工作。

我的环境:

  • Unity3D 4.3.4
  • Protobuf-net r668
  • 在Full / unity中使用protbuf-net.dll

如果有人能以我的方式指出错误,我将不胜感激。

修改

根据Flamy的建议,我将表单字符串[]更改为List

[ProtoMember(2)] public List<string> items;

可悲的是,错误仍然存​​在。

另一个注意事项

此外,我决定使用dll反编译器来查看发生了什么。在删除“string [] items”变量之前,我无法反编译dll。

解决

我认为这与使用Unity3D编译DLL有些问题有关。

当我使用上面显示的代码在Visual Studios中创建项目时,一切似乎都按预期工作。这是一种解脱,因为如果protobuf无法序列化string[],这似乎是一个巨大的问题。

我按照BCCode提供的文章来设置visual studio项目并编译DLL。

现在我需要做的就是用我的大型项目创建dll! 手指交叉

感谢大家的帮助!

2 个答案:

答案 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接受属性的属性!)或者创建一个字符串列表(虽然我还没有测试它应该工作!)