Существуют лм в мире .NET open source утилиты для XML data binding'a?
Т.е. увязывания xml-представления некоторых данных с их представлением в ввиде c sharp класса, автоматическая трансформация данных в из одного представления в другое, и генерация на основе одного представления эквивалентного ему второго.
Пример в Java world такой утилиты — JibX (http://jibx.sourceforge.net/).
AS>Я наверно туплю. Чем не устраивает стандартный сериализатор?
Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.
Причем это взаимно однозначное соответствие:
вовсе не означает, что члены класса и поля xml будут называться одинаково,
члены класса и поля xml могут иметь различные (но совместимые) типы
Здравствуйте, iAlexander, Вы писали:
AS>>Я наверно туплю. Чем не устраивает стандартный сериализатор?
A>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить. A>Причем это взаимно однозначное соответствие: A>
A>вовсе не означает, что члены класса и поля xml будут называться одинаково, A>члены класса и поля xml могут иметь различные (но совместимые) типы A>
Там для сериализатора атрибуты управляющие есть, которые всё это умеют. Пример:
public class Item
{
[XmlAttribute("root")]
public string Path { get; set; }
[XmlAttribute]
public string Assembly { get; set; }
private string m_propertyName;
[XmlAttribute]
public string PropertyName
{
get
{
return string.IsNullOrEmpty(m_propertyName)?
Group.NonWordRegex.Replace(System.IO.Path.GetFileNameWithoutExtension(this.Path.Replace("~/", string.Empty)), string.Empty)
: m_propertyName;
}
set { m_propertyName = value; }
}
[XmlIgnore]
public string ResourceName
{
get { return Path.Replace("~/", string.Empty).Replace("/", "."); }
}
}
Здравствуйте, iAlexander, Вы писали:
AS>>Я наверно туплю. Чем не устраивает стандартный сериализатор?
A>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.
Тогда добавим к сериализатору xslt и получим возможность сохранения объектов дотнета в любой xml.
Help will always be given at Hogwarts to those who ask for it.
Спасибо, тогда скорее всего для текущих нужд мне будет достаточно сериализатора.
Однако цели биндинг'а вообще шире простой сериализации/десериализации объектов. Например: по предложенному [фиксированному] входному XML сделать маппинг на уже существующий и лишь частично перекрывающийся с xml по полям класс. Изменять маппинг как конфиг и подсовывать его в рантайме без перезапуска. Валидация xml по xsd схеме перед конструированием объекта.
Здравствуйте, _FRED_, Вы писали:
A>>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.
_FR>Тогда добавим к сериализатору xslt и получим возможность сохранения объектов дотнета в любой xml.
Если взглянуть чисто математически, то да. Задачка решена.
Но с точки зрения инженера-прикладника мы получим немалый overhead на xsl transformation, а бонусом — разработку двух видов трансформаций: прямой и обратной. При этом [скорее всего] построение и разбор xml будут производиться универсальным SAX|DOM|C#-specific парсером.
А класс, созданный JiBX'ом, по скорости разбора рвет всех конкурентов за счет того, что сгенерированный им код предназначен для разбора только того конкретного xml ,на схему которого был натравлен кодогенератор.
Здравствуйте, iAlexander, Вы писали:
A>Здравствуйте, Aen Sidhe, Вы писали:
AS>>Там для сериализатора атрибуты управляющие есть, которые всё это умеют. Пример:
A>Однако цели биндинг'а вообще шире простой сериализации/десериализации объектов. Например: по предложенному [фиксированному] входному XML сделать маппинг на уже существующий и лишь частично перекрывающийся с xml по полям класс. Изменять маппинг как конфиг и подсовывать его в рантайме без перезапуска. Валидация xml по xsd схеме перед конструированием объекта.
A>А класс, созданный JiBX'ом, по скорости разбора рвет всех конкурентов за счет того, что сгенерированный им код предназначен для разбора только того конкретного xml ,на схему которого был натравлен кодогенератор.
XmlSerializer изготавливает и компилирует класс, предназначенный для разбора XML-я совершенно конкретного формата.
Здравствуйте, iAlexander, Вы писали:
A>Здравствуйте, _FRED_, Вы писали:
A>>>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.
_FR>>Тогда добавим к сериализатору xslt и получим возможность сохранения объектов дотнета в любой xml.
A>Но с точки зрения инженера-прикладника мы получим немалый overhead на xsl transformation, а бонусом — разработку двух видов трансформаций: прямой и обратной. При этом [скорее всего] построение и разбор xml будут производиться универсальным SAX|DOM|C#-specific парсером.
Нет, не верно. Под каждый класс генерируется специфический парсер, который работает крайне быстро.
Здравствуйте, hardcase, Вы писали:
H>XmlSerializer изготавливает и компилирует класс, предназначенный для разбора XML-я совершенно конкретного формата.
To increase performance, the XML serialization infrastructure dynamically generates assemblies to serialize and deserialize specified types. The infrastructure finds and reuses those assemblies.