2014-12-11 2 views
1

Я должен предложить техническое предложение для сериализации большого набора объектов в XML. В настоящее время мы имеем базу данных с NHibernateXmlSerialization: вопросы о производительности и ссылках

Это на самом деле не точка, но так как я уже, что это будет ваш первый вопрос:

Почему XML

  • У нас очень специфическая потребность: У нас много данных, но мы иногда используем их только один раз, чтобы настроить множество аппаратных устройств в сети. Это означает, что когда нам нужны данные, мы читаем всю базу данных.
  • В настоящее время мы используем NHibernate, и создается впечатление, что из-за сложной структуры класса требуется многократно сериализовать/десериализовать данные.
  • У нас есть много уровней иерархии, и это занимает много времени, чтобы сделать присоединяется
  • Нам часто приходится изменять структуру, XSLT будет соответствовать отлично нашему обновлению нуждается
  • Мы хотим избежать библиотек третьих стороной (лицензирование + выпуск)

Итак, теперь я думаю о том, что было бы лучшим способом сериализации этих данных.

Я знаю класс XmlSerializer, но для того, что я понял, он работает отражением, получая все свойства, проверяя, есть ли какой-либо декоратор по методу/свойствам, и я обеспокоен проблемой производительности.

Я также беспокоюсь о ссылках: у нас есть корневой объект, а лист может ссылаться на другой лист (например: корень узла A, которому принадлежит объект B и C, и ссылка C B (очень фиктивный пример, в в нашем случае мы имеем много уровней/абстракцию между ними). ​​

  1. Правильно ли я об использовании отражения с XmlSerializer? есть ли способ, чтобы избежать отражений (кроме реализации IXmlSerializable?
  2. Как вы справляетесь эти объекты ссылаются дважды (и если вы только сериализуете одну ссылку, есть ли способ восстановить другую ссылку?
+0

Я бы просто использовал 'XDocument' /' XElement'. –

+0

Каждый сериализатор должен знать о наборе полей для типа. Единственный способ сделать это в целом - использовать отражение или предоставить интерфейс ('ISerializable',' IXmlSerializable'), который отбрасывает сериализацию пользователю. –

+0

Исключением будет то, что вы пишете сериализатор, специально предназначенный для сериализации определенного графа объектов, а не обобщенный сериализатор. –

ответ

0

У меня нет времени этим утром для лучшего примера, но рассмотрим следующий простой случай:

public class Inner { 
    public int IX {get;set;} 
    public string IY {get;set;} 
} 

public class Outer { 
    public int OX {get;set;} 
    public IEnumerable<Inner> OI {get;set;} 
} 

public XDocument SerializeOuter(Outer obj) 
{ 
    return new XDocument(
     new XElement("Outer", 
      new XAttribute("OX", obj.OX.ToString()), 
      new XElement("Inners", from i in obj.OI 
            select SerializeInner(i)))); 
} 

private XElement SerializeInner(Inner obj) 
{ 
    return new XElement("Inner", 
         new XAttribute("IX", obj.IX), 
         new XElement("IY", obj.IY)); 
} 

Пример использования:

public static void Demo() 
{ 
    var outer = new Outer { 
     OX = 1, 
     OI = new[] {new Inner {IX = 2, IY = "two"}, new Inner {IX = 3, IY = "three"}} 
    }; 

    var doc = SerializeOuter(outer); 
    Console.WriteLine(doc.ToString()); 
} 

Это дает:

<Outer OX="1"> 
    <Inners> 
    <Inner IX="2"> 
     <IY>two</IY> 
    </Inner> 
    <Inner IX="3"> 
     <IY>three</IY> 
    </Inner> 
    </Inners> 
</Outer> 
+0

Это интересно, но как бы вы справились с этой ссылкой? – J4N

+0

Несколько ссылок на один и тот же объект должны обрабатываться в вашей логике посещения. –

Смежные вопросы