Ios 使用Protobuf net,我得到了一个关于未知导线类型的异常,列表为<;子类>;

Ios 使用Protobuf net,我得到了一个关于未知导线类型的异常,列表为<;子类>;,ios,unity3d,protobuf-net,Ios,Unity3d,Protobuf Net,我已经开始将我们的Unity/iOS游戏转换为使用Protobuf net保存状态。看起来一切正常,直到我将这个实例变量添加到GameState [ProtoMember(10)] public List<Unit> fUnits; 这是我序列化的第一个子类。我在编写代码后立即反序列化来测试代码 using (Stream memoryStream = new MemoryStream()) { byte[] data = System.Text.Encoding.UTF8

我已经开始将我们的Unity/iOS游戏转换为使用Protobuf net保存状态。看起来一切正常,直到我将这个实例变量添加到
GameState

[ProtoMember(10)]
public List<Unit> fUnits;
这是我序列化的第一个子类。我在编写代码后立即反序列化来测试代码

using (Stream memoryStream = new MemoryStream()) {
    byte[] data = System.Text.Encoding.UTF8.GetBytes(readText);
    memoryStream.Write(data, 0, data.Length);
    memoryStream.Position = 0;
    WBTSSerializer deserializer = new WBTSSerializer();

    testState = new GameState();
    deserializer.Deserialize(memoryStream, testState, typeof(GameState));
}
我得到

ProtoBuf.ProtoException: Invalid wire-type; this usually means you have over-written a file without truncating or setting the length; see http://stackoverflow.com/q/2152978/23354
  at ProtoBuf.ProtoReader.SkipField () [0x00000] in <filename unknown>:0
  at WBTSSerializer.Read (wbts.Unit , ProtoBuf.ProtoReader ) [0x00000] in <filename unknown>:0
  at WBTSSerializer.Read (wbts.GameState , ProtoBuf.ProtoReader ) [0x00000] in <filename unknown>:0
  at WBTSSerializer.Deserialize (Int32 , System.Object , ProtoBuf.ProtoReader ) [0x00000] in <filename unknown>:0
  at ProtoBuf.Meta.TypeModel.DeserializeCore (ProtoBuf.ProtoReader reader, System.Type type, System.Object value, Boolean noAutoCreate) [0x00000] in <filename unknown>:0
  at ProtoBuf.Meta.TypeModel.Deserialize (System.IO.Stream source, System.Object value, System.Type type, ProtoBuf.SerializationContext context) [0x00000] in <filename unknown>:0
  at ProtoBuf.Meta.TypeModel.Deserialize (System.IO.Stream source, System.Object value, System.Type type) [0x00000] in <filename unknown>:0
  at wbts.Game.SaveGame (System.String filename) [0x000c1] in /Users/david/Shenandoah/WBTS/wbts/wbts/Game.cs:620
ProtoBuf.ProtoException:导线类型无效;这通常意味着您在没有截断或设置长度的情况下重写了文件;看见http://stackoverflow.com/q/2152978/23354
在ProtoBuf.ProtoReader.SkipField()[0x00000]中:0
在:0中的WBTSSerializer.Read(wbts.Unit,ProtoBuf.ProtoReader)[0x00000]处
在:0中的WBTSSerializer.Read(wbts.GameState,ProtoBuf.ProtoReader)[0x00000]处
在WBTSSerializer.Deserialize(Int32,System.Object,ProtoBuf.ProtoReader)[0x00000]中:0
在ProtoBuf.Meta.TypeModel.DeserializeCore(ProtoBuf.ProtoReader,System.Type,System.Object值,布尔noAutoCreate)[0x00000]中:0
在ProtoBuf.Meta.TypeModel.Deserialize(System.IO.Stream源、System.Object值、System.Type类型、ProtoBuf.SerializationContext上下文)[0x00000]处,输入:0
在ProtoBuf.Meta.TypeModel.Deserialize(System.IO.Stream源、System.Object值、System.Type类型)[0x00000]中:0
在/Users/david/Shenandoah/wbts/wbts/wbts/wbts/wbts/Game.cs中的wbts.Game.SaveGame(System.String文件名)[0x000c1]处:620
不用说,我已经检查了覆盖(这是一个全新的文件)。而且,如果我取出
原型成员(10)
,它不会抛出

如果我去掉
ProtoInclude
行,我会得到一个关于子类的错误。而且,如果我取出
单元
中的
原型成员
,它仍然抛出


如果有关系的话,我现在只是从Xamarin(在MacOSX上——我是一名iOS开发人员)运行这个。但这只是为了便于测试,我设法用足够的棍子击打Protobuf net,使其能够在iPad上运行。

我的眼睛立刻被吸引到:

byte[] data = System.Text.Encoding.UTF8.GetBytes(readText);

Protobuf数据不是文本,也不是UTF-8(尽管Protobuf数据中的字符串碰巧是UTF-8)-因此,通过
UTF8
对其进行“解码”(实际上是错误的单词)将保证数据被破坏。处理protobuf数据的首选方法是二进制数据,例如,一个
字节[]
,与处理图像数据等非常相似。但是,如果需要以文本形式存储或传输数据,然后
Convert.ToBase64String
Convert.FromBase64String
是在文本和二进制之间进行转换的合适机制。有关更多信息,请参阅的第一节。

几乎可以肯定,这是一个来自XML序列化的.NET无意识复制粘贴。不幸的是,当我使用正确的byte[]处理(包括Mono本身崩溃)时,我就开始出现其他错误,然后我忘记了获取支持iOS的DLL的步骤。现在我回到.NET的XML序列化。
byte[] data = System.Text.Encoding.UTF8.GetBytes(readText);