反序列化 List<T>

3
我在反序列化时遇到了以下错误:
无效的线路类型;这通常意味着您已经覆盖了一个文件而没有截断或设置长度。请参阅使用Protobuf-net,我突然遇到了有关未知线路类型的异常 上述链接只提到了文件截断问题,但是我正在创建一个新文件。
 Stopwatch sw = new Stopwatch();
            List<SomeClass> items = CreateSomeClass();
            sw.Start();
            using (var file = File.Create(fileName))
            {
                var model = CreateModel();
                model.Serialize(file, items);
                file.SetLength(file.Position);
            }
            sw.Stop();
            logger.Debug("Saving/serialization to {0} took {1} m/s", fileName, sw.ElapsedMilliseconds);
            sw.Reset();
            logger.Debug("Starting deserialzation...");
            sw.Start();
            using (var returnStream = new FileStream(fileName, FileMode.Open))
            {
                var model = CreateModel();
                var deserialized = model.Deserialize(returnStream, null, typeof(SomeClass));
            }
            logger.Debug("Retrieving/deserialization of {0} took {1} m/s", fileName, sw.ElapsedMilliseconds);

 public static TypeModel CreateModel()
    {
        RuntimeTypeModel model = TypeModel.Create();

        model.Add(typeof(SomeClass), false)
            .Add(1, "SomeClassId")
            .Add(2, "FEnum")
            .Add(3, "AEnum")
            .Add(4, "Thing")
            .Add(5, "FirstAmount")
            .Add(6, "SecondAmount")
            .Add(7, "SomeDate");
        TypeModel compiled = model.Compile();

        return compiled;
    }

 public enum FirstEnum
{ 
    First = 0,
    Second,
    Third
}
public enum AnotherEnum
{ 
    AE1 = 0,
    AE2,
    AE3
}
[Serializable()]
public class SomeClass
{
    public int SomeClassId { get; set; }
    public FirstEnum FEnum { get; set; }
    public AnotherEnum AEnum { get; set; }
    string thing;
    public string Thing
    {
        get{return thing;}
        set
        {
            if (string.IsNullOrEmpty(value))
                throw new ArgumentNullException("Thing");

            thing = value;
        }
    }
    public decimal FirstAmount { get; set; }
    public decimal SecondAmount { get; set; }
    public decimal ThirdAmount { get { return FirstAmount - SecondAmount; } }
    public DateTime? SomeDate { get; set; }
}

我刚接触Protobuf-net,是否有什么明显的错误或遗漏?

2个回答

2
你将其序列化为一个列表,然后将其反序列化为单个项目。这是一个问题。要么使用DeserializeItems,要么:不要使用列表进行序列化。
typeof(SomeClass)

通过
typeof(List<SomeClass>)

DeserializeItems可能会更快一些(由于各种原因,当Deserialize被调用并且操作数是列表类型时,它需要执行额外的工作)。

等等,这是不是意味着[ProtoMember(10)] public List<Unit> fUnits;不能用?我在反序列化包含此字段的对象时遇到了错误。 - David Dunham
@DavidDunham 不,这完全不意味着那个;毫无关联。 - Marc Gravell

1

鉴于错误似乎表明反序列化读取器想要读取额外的字节,请尝试在不使用file.SetLength(file.Position)的情况下运行您的代码,这应该是不必要的(文件流知道其长度)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接