Нужна помощь с хорошим дизайном для отношений один-на-один с сериализацией XML в C # - PullRequest
1 голос
/ 25 октября 2010

Предполагая, что у меня есть некоторые данные в виде

Customer1
 Name
 Address
 Order1
  ID
  Products
   Product1
    ID
   Product2
    ID
Customer2
 ...

Использование следующего класса для его представления

class Customer
{
 public String name { get; set; }
 public String Address {get; set;}
 public List<OrderInfo> Orders { get; set; }
} 

class Order
{
 public int ID { get; set; }
 public List<Product> Products { get; set; }
}

class Product
{
 public int ID { get; set; }
}

Я бы хотел использовать сериализацию XML для чтения / записи данных, а не использовать структуру сущностей и SQL. С помощью структуры сущностей я смогу определить отношение «многие к одному», чтобы каждый продукт сохранялся в базе данных только один раз, а каждый заказ просто ссылался на него. Используя приведенный выше код с сериализацией XML, я понимаю, что будет сохранено много копий каждого продукта (как в памяти, так и в файле XML).

Чтобы исправить это, я мог бы просто сохранить список идентификаторов продуктов вместо самих продуктов, а затем просто сериализовать отдельную коллекцию «продуктов» в другой файл XML - но это не кажется мне чистым решением.

Другой идеей было бы иметь класс RepositoryClass, который содержал бы список клиентов и продуктов. В этом случае клиенты должны будут хранить только идентификаторы продуктов, а когда вы запрашиваете «клиента» в репозитории, он обрабатывает поиск и создание вышеуказанных объектов, поэтому остальной части моего кода не придется беспокоиться о том, как хранятся данные. , Это звучит как лучшее решение? Как бы вы это сделали?

Другое требование к решению это то, что я хочу, чтобы как можно проще было подключить решение к графическому интерфейсу для непосредственного редактирования свойств (поэтому на самом деле я хочу, чтобы был способ сохранить все это в одном XML-файле, который я мог бы просто привязать к окну WPF).

Заранее спасибо за ваши мысли и советы!

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Не было бы копий, сохраненных в памяти, потому что вы могли бы создать конкретный продукт один раз и ссылаться на этот продукт с тех пор.

Случай с xml немного сложнее.Спецификация xml имеет решение для этого, но я не уверен, насколько хорошо .NET Framework поддерживает это.У вас может быть XML-документ, подобный следующему:

<rootElement>
    <Customers>
        <Customer ...>
            <Order>
                <ProductRef ref="1" />
                <ProductRef ref="2" />
            </Order>
        </Customer>
    </Customers>
    <Products>
        <Product id="1" />
        <Product id="2" />
        <Product id="3" />
        <Product id="4" />
    </Products>
</rootElement>

Проверяющий анализатор XML проверит, что id уникальны в документе и что каждый атрибут ref фактически ссылается на id, есливы указываете DTD или XML-схему, которая требует этого.

Конечно, вам все равно придется создавать что-то, что анализирует эту структуру, но у вас больше нет дублирующихся данных XML.

0 голосов
/ 19 февраля 2012

DataContractDeserializer в .NET имеет аргумент конструктора preserveObjectReferences. Если для этого аргумента установлено значение true (по умолчанию - false), идентичность объектов сохраняется. Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/ms731073.aspx

...