У нас есть проект с «пользовательскими объектами и атрибутами», созданный на java-сервере, и нужны эти данные на клиенте C#.DataContract + IxmlSerializable
например. Пользовательский объект «A» имеет атрибуты «B», «C». Оба «B» и «C» описываются клиентом во время выполнения. Сервер отправляет нам это в XML, как:
<A>
<B> B Data </B>
<C> C Data </C>
</A>
Мы создали класс, реализующий IXmlSerializable, что чтение/запись XML для сервера заполнения пользовательских атрибутов в словарь
public class CustomObject : IXmlSerializable
{
private Dictionary<String, String> attributes;
public void ReadXml(XmlReader reader)
{
attributes = XDocument.Parse(reader.ReadOuterXml()).Root.Elements()
.ToDictionary(xElm => xElm.Name.LocalName, xElm => xElm.Value)
}
// More Serialization logic for IXmlSerializable is here
}
Проект является медленным и мы хотим использовать более быструю сериализацию DataContract. Мы опробовали образец, явно указав строковые коды [DataContract] на наши атрибуты (например, «B», «C»). Однако в наших случаях использования атрибуты не известны во время компиляции. Мы можем запросить сервер для списка атрибутов типа «A».
Как мы можем использовать DataContract для атрибутов, определенных во время выполнения
Вы можете попробовать внедрить ['IExtensibleDataObject'] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iextensibledataobject.aspx) в свой' CustomObject', а затем извлечь XML-файл, используя трюк в [ExtensionDataObject не помечен как сериализуемый] (https: // stackoverflow.ком/вопросы/32056762). Но, вы профилировали, чтобы определить, где настоящая проблема? – dbc
Почему вы делаете 'XDocument.Parse (reader.ReadOuterXml())'? Это эффективно анализирует XML дважды. Если у вас возникли проблемы с производительностью, вы можете заменить это на ['ReadSubtree()'] (https://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree.aspx). – dbc
Спасибо за обратную связь @dbc, кажется, что XDocument занимает около 16 мс для каждого объекта, а также добавляет к нашей сигнатуре памяти. Вот почему мы хотим DataContract. Я проведу ссылку, которую вы поделили. –