3

私は逆シリアル化でこのエラーをrxしています:

無効なワイヤタイプ。これは通常、長さを切り捨てたり設定したりせずにファイルを上書きしたことを意味します。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を初めて使用するので、間違っている/欠落している明らかなことはありますか?

4

2 に答える 2

2

これをリストとしてシリアル化し、単一のアイテムとして逆シリアル化します。これは問題だ。DeserializeItemsを使用するか、または:の代わりに

typeof(SomeClass)

パス

typeof(List<SomeClass>)

DeserializeItemsはおそらくわずかに高速です(さまざまな理由から、オペランドとしてリストタイプを使用してDeserializeが呼び出されると、追加の作業を行う必要があります)。

于 2012-04-05T20:55:15.840 に答える
1

エラーが逆シリアル化リーダーが追加のバイトを読み取りたいことを示しているように思われる場合は、必要のないfile.SetLength(file.Position)なしでコードを実行してみてください(ファイルストリームはその長さを認識しています)。

于 2012-04-05T20:01:30.063 に答える