<ProductName>NewProdName</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>1</CategoryID>
<QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>
<UnitPrice>18</UnitPrice>
<UnitsInStock>39</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>10</ReorderLevel>
<Discontinued>false</Discontinued>
</products>
<products diffgr:id='products2' msdata:rowOrder='1'>
<ProductID>2</ProductID>
<ProduсtName>Chang</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>1</CategoryID>
<QuantityPerUnit>24 - 12 oz bottles</QuantityPerUnit>
<UnitPrice>19</UnitPrice>
<UnitsInStock>17</UnitsInStock>
<UnitsOnOrder>40</UnitsOnOrder>
<ReorderLevel>25</ReorderLevel>
<Discontinued>false</Discontinued>
</products>
…
<products diffgr:id='products78' msdata:rowOrder='77' diffgr:hasChanges='inserted'>
<ProductID>100</ProductID>
<ProductName>This is a new product</ProductName>
<SupplierID>12</SupplierID>
<CategoryID>2</CategoryID>
<QuantityPerUnit>12</QuantityPerUnit>
<UnitPrice>23</UnitPrice>
<UnitsInStock>5</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>1</ReorderLevel>
<Discontinued>false</Discontinued>
</products>
</XMLProducts>
<diffgr:before>
<products diffgr:id='products1' msdata:rowOrder='0'>
<ProductID>1</ProductID>
<ProductName>Chai </ProductName>
<SupplierID>1</SupplierID>
<CategoryID>1</CategoryID>
<QuantityPerUnit>10 boxes x 20 bugs </QuantityPerUnit>
<UnitPrice>18</UnitPrice>
<UnitsInStock>39</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>10</ReorderLevel>
<Discontinued>false</Discontinued>
</products>
</diffgr:before>
</diffgr:diffgram>
Заметим, каким образом повторяется каждая строка DataTable
, и что существует атрибут diffgr:id
для каждого элемента <products>
. diffgr
является префиксом пространства имен для urn:schemas-microsoft-com:xml-diffgram-v1
. Для модифицированной строки и для вставленной строки ADO.NET добавляет атрибут diffgr:hasChanges
. Здесь есть также элемент <diffgr:before>
после элемента <XMLProducts>
, который содержит элемент <products>
, указывающий на предыдущее содержание всех модифицированных строк. Для добавленной строки не существует 'before'
, поэтому здесь отсутствует элемент <diffgr:before>
, однако он присутствует для модифицированной строки.
После того как DiffGram
считан в DataTable
, он оказывается в состоянии, в котором он был бы после выполнения изменений в данных перед вызовом AcceptChanges
. В этом месте можно на самом деле откатить изменения, вызывая метод RejectChanges
. Проверяя свойство DataRow.Item
и передавая либо DataRowVersion.Original
, либо DataRowVersion.Current
, можно увидеть значения в DataTable
перед и после изменений.
Сериализация объектов в XML
Сериализация является процессом сохранения объекта на диске. Другая часть приложения или даже другое приложение могут десериализовать объект и он будет в том же состоянии, в каком он был до сериализации. Платформа .NET содержит два способа выполнения сериализации. Рассмотрим пространство имен System.Xml.Serialization
.
Как показывает имя, сериализация производится в формате XML. Это делается преобразованием открытых свойств объекта и открытых полей в элементы и/или атрибуты. Сериализатор XML не может преобразовать скрытые данные, а только открытые. Представляйте это как способ сохранения состояния объекта. Если необходимо сохранить скрытые данные, то используйте BinaryFormatter
в пространстве имен System.Runtime.Serialization.Formatters.Binary
. Можно также:
□ Определить, должны ли данные быть атрибутом или элементом.
□ Определить пространство имен.
□ Изменить имя атрибута или элемента.
Вместе с возможностью сериализовать только открытые данные, невозможно сериализовать графы объектов (объекты, которые достижимы из сериализуемого объекта). Это не является серьезным ограничением. При тщательном проектировании классов этого легко можно избежать. Если необходимо иметь возможность сериализовать открытые и скрытые данные, а также граф объектов, содержащий множество вложенных объектов, то можно будет воспользоваться пространством имен System.Runtime.Serialization.Formatters.Binary
.
Данные для сериализации могут быть примитивными типами данных, полями, массивами и XML, встроенным в форму объектов XmlElement
и XmlAttribute
. Связью между объектом и документом XML являются специальные атрибуты, которые аннотируют классы. Эти атрибуты используются для того, чтобы информировать сериализатор, как записать данные.
На платформе .NET существует инструмент, помогающий создавать атрибуты,— это утилита xsd.exe
, которая может делать следующее:
□ Генерировать схему XML из файла схемы XDR
□ Генерировать схему XML из файла XML