Deserialization List <T>

I mean this error when deserializing:

Invalid wiring type; this usually means that you have overwritten the file without truncating or setting the length; see Using Protobuf-net I unexpectedly got an Unknown Wire Type Exception

This is only a mention of truncating the file, but I am creating a new file

 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; }
}

      

I am new to Protobuf-net, is there something obvious that I am doing wrong / missing?

+3


source to share


2 answers


You serialize it as a list and deserialize it as a separate item. This is problem. Either use DeserializeItems or: instead of

typeof(SomeClass)

      

Pass



typeof(List<SomeClass>)

      

DeserializeItems is probably slightly faster (for various reasons, it has to do extra work when Deserialize is called with the list type as operand).

+2


source


Given that the error seems to indicate that the deserialization reader wants to read additional bytes, try running your code without the .SetLength (file.Position) file, which is not needed (the file stream knows its length).



+1


source







All Articles