2015-02-22 2 views
0

Мне нравится XmlSerializer, из-за его работы с огнем и забытьем. Я могу дать XmlSerializer объект для сериализации и файл для сериализации, а XmlSerializer будет сортировать имена и значения свойств.Сериализация объектов в хранилище XML

XmlWriter xmlWriter = XmlWriter.Create(projectPath + "\\" + m_projectDescriptionFileName); // create new project description file (XML) 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(CustomerContactInfoViewModel)); 
xmlSerializer.Serialize(xmlWriter, contactInfo); 
xmlWriter.Close(); 

Мне нравится LINQ to XML для его навигации. Вот пример метода для редактирования объекта, который хранится в XML (адаптировано из Greg's blog. Там также фрагменты кода для вставки и удаления.)

public void EditBilling(Billing billing) 
{ 
    XElement node = m_billingData.Root.Elements("item").Where(i => (int)i.Element("id") == billing.ID).FirstOrDefault(); 

    node.SetElementValue("customer", billing.Customer); 
    node.SetElementValue("type", billing.Type); 
    node.SetElementValue("date", billing.Date.ToShortDateString()); 
    node.SetElementValue("description", billing.Description); 
    node.SetElementValue("hours", billing.Hours); 

    m_billingData.Save(HttpContext.Current.Server.MapPath("~/App_Data/Billings.xml")); 
} 

Как вы можете видеть, имена и значения свойств записываются в код, в отличие от XmlSerializer.

Я хотел бы иметь возможность хранить несколько объектов разных типов в одном XML-файле (добавляя их в разное время, а не все сразу). Я хотел бы иметь возможность десериализовать их по одному. Я хотел бы обновить их по одному.

  • Есть ли способ объединить навигацию по LINQ с удобством и безопасностью XmlSerializer?
  • Это XmlSerializer правильный инструмент для этого?
  • Есть ли что-то лучше (не доработав надлежащую базу данных)?
  • Я ищу что-то, что происходит под другим именем?

Любые предложения, идеи или ссылки действительно оценены!

+1

Я что-то упускаю, или ADO.NET вам не хватает? –

+0

@WesleyLong Возможно, это я чего-то не хватает, и ваш комментарий обращается к моему последнему вопросу «* ищет что-то, что происходит под другим именем?» «Тем временем я пойду, что ADO.NET может сделать для XML. –

+0

Я просто угадываю здесь, но не смог создать baseObjectXmlElement, который хранит Xml в виде строки/данных и typedescriptorstring? так что вы можете хранить что-либо в разделе данных и десериализовать его с помощью typestring –

ответ

0

Использование XmlSerializer не позволит напрямую сериализовать несколько объектов разных типов в один и тот же файл. Перед использованием XmlSerializer вам нужно немного почистить чтение xml-файла.

У вас есть два варианта.

Вариант № 1:

Первый в том, что у вас есть класс-обертку, как предложено в комментариях, который держит свои объекты. Затем вы можете использовать XmlSerializer для Serialize/Deserialize этого конкретного типа. Вы не можете напрямую выбрать часть xml и сериализовать это. Это позволит вам непосредственно сериализовать и десериализовать весь тип/класс.

Быстрый пример:

public class Container { 
    public MyType My {get;set;} 
    public OtherType Other {get;set;} 
} 

Container container = new Container(); 
... 
XmlSerializer serializer = new XmlSerializer(typeof(Container)); 
serializer.Serialize(aWriter, container); 

// deserialize 

StreamReader reader = new StreamReader("container.xml"); 
Container c = serializer.Deserialize(reader) as Container; 

Вариант № 2:

Вы можете прочитать файл XML с помощью XmlReader и использовать ReadToDecendant(string), чтобы найти текущее представление XML вашего объекта (назовем его MyType) и прочитайте этот xml, используя ReadSubTree(). Используя результат от ReadSubTree() и нажмите это на метод XmlSerializer.Deserialize().

Быстрая выборка будет что-то вроде:

XmlReader reader = XmlReader.Create("objects.xml"); 
if (reader.ReadToDecendant("MyType")) 
{ 
    var myTypeXml = reader.ReadSubTree(); // read the whole subtree (type) 
    XmlSerializer serializer = new XmlSerializer(typeof(MyType)); // define the type 
    MyType obj = serializer.Deserialize(myTypeXml); // 
} 

Записывая объект будет на противоположном пути, Serialize() тип в (XML) строку, а затем заменить соответствующий XML в файле ,

Вам было бы лучше использовать базу данных в качестве хранилища данных, а не xml. Надеюсь, у вас есть веская причина для использования файлов, а не базы данных.

Вариант № 2, вероятно, будет наиболее подходящим и наиболее гибким, поскольку он не полагается на классы-оболочки.

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