使用Protobuf-net,我得到了一个有关List <Subclassable>的未知types的exception

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

 [ProtoMember(10)] public List<Unit> fUnits; 

单位是

 [ProtoContract] [ProtoInclude(21, typeof(ArtilleryUnit))] [ProtoInclude(22, typeof(CavalryArtilleryUnit))] [ProtoInclude(23, typeof(CavalryUnit))] [ProtoInclude(24, typeof(InfantryUnit))] [Serializable] public class Unit : IActionHandler 

这是我已经序列化的第一个子类。 我正在通过反编写testing我的代码,写之后

 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 

不用说,我已经检查覆盖(这是一个全新的文件)。 而且,如果我拿出ProtoMember(10) ,它不会扔。

如果我拿出ProtoInclude行,我得到关于子类的错误。 而且,如果我在Unit内拿出ProtoMember ,它仍然会抛出。

如果有关系,我现在只是从Xamarin运行(在Mac OS X上 – 我是一个iOS开发人员)。 但是这只是为了便于testing,我已经设法用足够的支持来使Protobuf-net在iPad上运行。

我的眼睛马上被吸引到:

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

Protobuf数据不是文本也不是UTF-8(尽pipeprotobuf数据中的string是UTF-8),因此通过UTF8 “解码”它(错误的单词,真的)将保证您的数据损坏。 处理protobuf数据的首选方式是二进制的,例如byte[] ,就像图像数据等一样。但是,如果您需要以文本forms存储或传输它,那么Convert.ToBase64StringConvert.FromBase64String是在文本和二进制之间进行转换的合适机制。 请看第一节你可以搞砸IO有多less种方法? 了解更多信息。