首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Protobuf-net,我得到了一个关于List<Subclassable>中未知线型的异常。

使用Protobuf-net,我得到了一个关于List<Subclassable>中未知线型的异常。
EN

Stack Overflow用户
提问于 2014-07-07 13:07:37
回答 1查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
[ProtoMember(10)]
public List<Unit> fUnits;

单位是

代码语言:javascript
复制
[ProtoContract]
[ProtoInclude(21, typeof(ArtilleryUnit))]
[ProtoInclude(22, typeof(CavalryArtilleryUnit))]
[ProtoInclude(23, typeof(CavalryUnit))]
[ProtoInclude(24, typeof(InfantryUnit))]
[Serializable]
public class Unit : IActionHandler

这是我序列化的第一个子类。我正在测试我的代码,在编写完之后马上反序列化

代码语言:javascript
复制
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));
}

我得到了

代码语言:javascript
复制
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行,就会得到有关子类的错误。而且,如果我在ProtoMember中去掉Unit,它仍然会抛出。

如果这很重要,我目前只是从Xamarin (在Mac上-我是一个iOS开发人员)运行这个程序。但这只是为了便于测试,我已经设法用足够的棍子在iPad上运行Protobuf。

EN

回答 1

Stack Overflow用户

发布于 2014-07-07 13:17:30

我的眼睛立刻被吸引到:

代码语言:javascript
复制
byte[] data = System.Text.Encoding.UTF8.GetBytes(readText);

Protobuf数据不是文本,也不是UTF-8 (尽管protobuf数据中的字符串碰巧是UTF-8 )-因此,通过UTF8“解码”它(错误的单词,真的)将保证您损坏数据。处理原始数据的首选方法是二进制(例如,byte[] ),就像处理图像数据一样。然而,如果需要以文本形式存储或传输它,那么Convert.ToBase64StringConvert.FromBase64String是在文本和二进制之间转换的适当机制。有关更多信息,请参见你能用多少方法搞砸IO?的第一节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24611339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档