Самый дешевый способ отследить грязные поля - это использовать его в качестве ключевой функции вашей объектной модели, то есть с полем "fooDirty" для каждого поля данных "foo", которое вы устанавливаете в true в "наборе" (еслизначение отличается).Это также может быть объединено с условной сериализацией, возможно, паттерном «ShouldSerializeFoo ()», наблюдаемым несколькими сериализаторами.Мне неизвестны какие-либо библиотеки, которые соответствуют точно тому, что вы описываете (если только мы не включаем DataTable, но ... подумайте о котятах!)
Возможно, еще одна проблема заключается в необходимости отслеживатьвсе объекты для слияния при десериализации;это само по себе не бесплатно.
Однако, учитывая все обстоятельства, я думаю, что вы могли бы сделать что-то по приведенным выше строкам (fooDirty / ShouldSerializeFoo) и использовать protobuf-net в качестве сериализатора, потому что (что важно)который поддерживает как условную сериализацию, так и слияние.Я бы также предложил интерфейс, такой как:
ISomeName {
int Key {get;}
bool IsDirty {get;}
}
IsDrty позволит вам быстро проверить все ваши объекты на предмет изменений, затем добавить ключ в поток, а затем (условную) сериализацию.Вызывающая сторона считывает ключ, получает необходимый объект (или выделяет новый с этим ключом), а затем использует десериализацию с поддержкой слияния (передавая существующий / новый объект).
Не полная прогулкачерез, но , если бы это был я , это подход, на который я бы смотрел.Примечание: добавление / удаление / упорядочение объектов в дочерних коллекциях - сложная область, о которой, возможно, стоит подумать.