Можно ли частично сериализовать объект, используя Protobuf-net? - PullRequest
1 голос
/ 04 июня 2011

Я хотел бы иметь возможность обновлять объекты путем сериализации / десериализации только поля, которое изменилось.Я использую неуниверсальную версию сериализатора, так как я не знаю тип при компиляции.Во время выполнения у меня действительно есть тип.

Локально я хочу сделать что-то вроде:

var existingObject.SomeField = 10;

// Say I only want to serialize field B
byte[] serializedField = SerializeField(existingObject, "SomeField")

Удаленно я бы десериализовал и создал новый объект:

Merge(serializedField, existingObject);

Кажется, нет способа сделать это с помощью интерфейса NonGeneric?

1 Ответ

1 голос
/ 04 июня 2011

У вас есть несколько вариантов.

Если ваш тип внутренне знает, что изменилось, вы можете использовать тот же шаблон, что и XmlSerializer (IIRC), т.е.

[ProtoMember(12)]
public string Foo {get;set;}

public bool ShouldSerializeFoo() {
    return ... true if Foo is dirty
}

Второй вариант - создать модель на лету и рассказать ей только об измененных членах. Тем не менее, поскольку по умолчанию это приведет к генерации большого количества динамического кода (со временем), вы можете установить для AutoCompile значение fse для этого случая.

Третий вариант - сериализация вручную через ProtoWriter. Вероятно, для этого требуется больше ноу-хау по протоколу, чем желательно.

...