Атрибуты и элементы в DataContractSerializer - PullRequest
1 голос
/ 31 января 2011

Мне нужно реализовать такую ​​структуру:

Работодатель:

  • ID
  • Имя
  • Фамилия
  • E-Mail
  • Дата рождения
  • Клиенты
    • ID
    • Имя
    • Адрес
    • Телефон
    • E-Mail
    • Более 1000 сотрудников
  • Бизнес
    • ID
    • Имя
    • Описание

Каждый сотрудник может иметь более одного клиента, все данные должны храниться / загружаться в / из XML-файла с использованием xml-сериализации, бизнес-поля должны храниться в xml как attribute .

public class AllEntities
{
    public AllEntities()
    {
        Create();        
    }

    public List<Employee> allEmployees { get; set; }

    public List<Customer> allCustomers { get; set; }

    public List<Business> allBusiness { get; set; }

    private void Create()
    {
        allCustomers = new List<Customer> { new Customer ("Company1", "Minsk", "1236547", "trata@tut.by", false), 
                                            new Customer("Company2", "Minsk", "7896589", "itr@tut.by", false)};
        allBusiness = new List<Business> { new Business("Programming", "Short description"),
                                           new Business("Desin", "Short description")};

        allEmployees = new List<Employee> { new Employee("Alex", "Malash", "mal@tut.by", new DateTime(1990, 5, 9), allCustomers, allBusiness[0]),
                                            new Employee("Ira", "Vashnko", "ira@tut.by", new DateTime(1990, 9, 1), new List<Customer> { allCustomers[0] }, allBusiness[1]),
                                            new Employee("Igor", "Loshara", "igor@tut.by", new DateTime(1990, 1, 8), allCustomers, allBusiness[0])};
    }
}

Когда я использую DataContractSerializer, я не могу создавать атрибуты, и когда я использую XmlSerializer, при десериализации возникают несоответствия в одних и тех же объектах (Customer) у разных сотрудниковесть несколько разных объектов с одинаковыми полями).

что я могу попробовать?

1 Ответ

2 голосов
/ 31 января 2011

DataContractSerializer не имеет атрибутов, поэтому забудьте об этом. Вы действительно хотите XmlSerializer. Мне очень непонятно, какую проблему вы описываете с помощью идентификаторов. Я был бы очень удивлен, если бы это десериализовало это неправильно. Возможно, опубликуйте повторяемый пример, если вы считаете, что это так, но это звучит так, как будто у вас просто есть данные, которых вы не ожидали.

Данные - это данные, но мне интересно, так ли это, потому что вы ожидаете полную десериализацию "графа" (сохранение ссылок на объекты). XmlSerializer - это «древовидный» сериализатор, поэтому не имеет значения, если один и тот же объект был сериализован 6 раз - он десериализуется в 6 различных объектов. Там нет ничего особенного / уникального, чтобы идентифицировать их. Единственным вариантом будет исправить их вручную, проверив наличие дубликатов и заменив их одним общим экземпляром.

Чтобы поместить это в картинки; если вы сериализуете дерево

A

  • B
    • C
  • D
    • C

(тот же экземпляр под B и D), он будет десериализован как:

A

  • B
    • C
  • D
    • E

Но просто C и E будут разными объектами с одинаковыми значениями.

...