protobuf-net Слияние коллекции в существующий файл - PullRequest
3 голосов
/ 11 августа 2010

Я сериализовал коллекцию в файл, используя protobuf-net.

Я ищу способ объединить еще несколько элементов в существующий файл.

В настоящее время у меня есть это:

[Test]
public void CanAppend()
{
    var list = new List<Person>();

    for (int i = 0; i < 1000; i++)
       list.Add(new Person {Name = i.ToString(), Age = i});

    using (var file = File.Create("person.bin"))
    {
       Serializer.Serialize<List<Person>>(file, list);
    }

    list.Clear();

    for (int i = 1000; i < 2000; i++)
       list.Add(new Person { Name = i.ToString(), Age = i });

    using (var file = File.OpenRead("person.bin"))
    {
       Serializer.Merge<List<Person>>(file, list);
    }

    using (var file = File.OpenRead("person.bin"))
    {
       list = Serializer.Deserialize<List<Person>>(file);
    }

    //Fails here    
    Assert.That(list.Count, Is.EqualTo(2000));
}

[ProtoContract]
class Person
{
   [ProtoMember(1)]
   public string Name { get; set; }

   [ProtoMember(2)]
   public int Age { get; set; }
}

Но это не работает.Есть идеи?

1 Ответ

2 голосов
/ 11 августа 2010

Merge - операция десериализации (используется для чтения потока как дельты в существующий объект).К счастью, последовательности protobuf просто аддитивны, поэтому все, что вам нужно сделать, это открыть поток для добавления (или вручную перейти к концу потока), а затем вызвать Serialize.

using (var file = File.Open("person.bin", FileMode.Append, FileAccess.Write)) {
    Serializer.Serialize(file, list);
}
...