Мы решили эту проблему, включив строковый массив измененных имен свойств в каждый DTO. Код обновления в службе только проверяет и записывает свойства, имена которых находятся в этом массиве.
Чтобы упростить кодирование, мы поместили этот массив строк в абстрактный базовый класс и унаследовали от него все «изменяемые» DTO. Например:
<DataContract>
Public MustInherit Class ChangeTrackableObject
<DataMember> Public Property Changes As HashSet(Of String)
End Class
Атрибутов <KnownType>
нет, поскольку в этом случае полиморфизм DTO не требуется. DataContractSerializer
просто использует отношение наследования для получения свойства базового класса, ничего более.
Эта система работает одинаково хорошо из клиентского кода .NET и Java. Java-клиенты видят это как строковый массив. У нас есть библиотека методов расширения для клиентов .NET, чтобы упростить заполнение данных.