Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

private void button1_Click(object sender, System.EventArgs e) {

 // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ ΠΊΠ½ΠΈΠΆΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ

 Product newProd=new Product();

 BookProduct newBook=new BookProduct();

 // Π·Π°Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ свойства

 newProd.ProductID=100;

 newProd.ProductName="Product Thing";

 newProd.SupplierID=10;

 newBook.ProductID=101;

 newBook.ProductName="How to Use Your New Product Thing";

 newBook.SupplierID=10;

 newBook.ISBN="123456789";

 //ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ элСмСнты Π² массив

 Product[] addProd={newProd, newBook};

 // Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Inventory с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ массива addProd

 Inventory inv=new Inventory();

 inv.InventoryItems=addProd;

 // сСриализуСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Inventory

 TextWriter tr=new StreamWriter("..\\..\\..\\order.xml");

 XmlSerializer sr=new XmlSerializer(typeof(Inventory));

 sr.Serialize(tr, inv);

 tr.Close();

}

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Π² событии button2_Click, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ просматриваСм массив Π²ΠΎ вновь созданном ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ newInv, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅:

private void button2_Click(object sender, System.EventArgs e) {

 Inventory newInv;

 FileStream f=new FileStream("..\\..\\..\\order.xml", FileMode.Open);

 XmlSerializer newSr=new XmlSerializer(typeof{Inventory));

 newInv=(Inventory)newSr.Deserialize(f);

 foreach(Product prod in newInv.Inventory Items) listBox1.Items.Add(prod.ProductName);

 f.Close();

}


public class inventory {

 private Product[] stuff;

 public Inventory() {}

ΠœΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ XmlArrayItem для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² массив. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ опрСдСляСт имя элСмСнта Π² создаваСмом Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ XML. Если ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ElementName, Ρ‚ΠΎ элСмСнты ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ имя Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Product ΠΈ BookProduct). БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ класс XmlArrayAttribute, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли свойство Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π² массивС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ XmlArrayItemAttribute, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π±ΠΎΠ»Π΅Π΅ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ управлСния:

 // Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ запись Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…

 [XmlArrayItem("Prod", typeof(Product)), XmlArrayItem("Book", typeof(BookProduct))]

 //public Inventory(Product [] InventoryItems) {

 // stuff=InventoryItems;

 //}


 public Product[] InventoryItems {

  get {return stuff;}

  set {stuff=value;}

 }

}


//класс Product

public class Product {

 private int prodId;

 private string prodName;

 private int suppId;

 public Product() {}

 public int ProductID {

  get {return prodId;}

  set {prodId=value;}

 }

 public string ProductName {

  get {return prodName;}

  set {prodName=value;}

 }

 public int SupplierID {

  get {return suppId;}

  set {suppId=value;}

 }

}


// Класс Bookproduct

public class BookProduct: Product {

 private string isbnNum;

 public BookProduct() {}

 public string ISBN {

  get {return isbnNum;}

  set {isbnNum=value;}

 }

}

Π’ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… класса. Класс Inventory Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ добавляСтся Π½Π° склад. МоТно Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡŽ Π½Π° основС класса Product ΠΈΠ»ΠΈ класса BookProduct, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Product. Π’ классС Inventory содСрТится массив Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π² Π½Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ BookProducts, Ρ‚Π°ΠΊ ΠΈ Products. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML:

<?xml version="1.0" ?>

<Inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

 <InventoryItems>

  <Prod>

   <ProductID>100</ProductID>

   <ProductName>Product Thing</ProductName>

   <SupplierID>10</SupplierID>

  </Prod>

  <Book>

   <ProductID>101</ProductID>

   <ProductName>How to Use Your New Product Thing</ProductName>

   <SupplierID>10</SupplierID>

   <ISBN>123456789</ISBN>

  </Book>

 </InventoryItems>

</Inventory>

ВсС это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ прСкрасно, Π½ΠΎ ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ Π² ситуации, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ‚ доступа ΠΊ исходному ΠΊΠΎΠ΄Ρƒ Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ? НСвозмоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Ссли отсутствуСт исходный ΠΊΠΎΠ΄. БущСствуСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ. МоТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ классами XmlAttributes ΠΈ XmlAtrtributeOverrides. ВмСстС эти классы позволят Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π² точности Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ сдСлано, Π½ΠΎ Π±Π΅Π· добавлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, находящийся Π² ΠΏΠ°ΠΏΠΊΠ΅ SerialSample4:

private void button1_Click(object sender, System.EventArgs e) {

 // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ XmlAttributes XmlAttributes attrs=new XmlAttributes();

 // Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ сСриализированы

 attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));

 attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));

 XmlAttributeOverrides attrOver=new XmlAttributeOverrides();

 //Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

 attrOver.Add(typeof(Inventory), "InventoryItems", attrs);

 // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Product ΠΈ Book

 Product newProd=new Product();

 BookProduct newBook=new BookProduct();

 newProd.ProductID=100;

 newProd.ProductName="Product Thing";

 newProd.SupplierID=10;

 newBook.ProductID=101;

 newBook.ProductName="How to Use Your New Product Thing";

 newBook.SupplierID=10;

 newBook.ISBN="123456789";

 Product[] addProd={newProd, newBook};

 //Product[] addProd={newBook};

 Inventory inv=new Inventory();

 inv.InventoryItems=addProd;

 TextWriter tr=new StreamWriter("..\\..\\..\\inventory.xml");

 XmlSerializer sr=new XmlSerializer(typeof(Inventory), attrOver);

 sr.Serialize(tr, inv);

 tr.Close();

}


private void button2_Click(object sender, System.EventArgs e) {

 //Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ процСсс для дСсСриализации

 // создаСм Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ XmlAttributes

 XmlAttributes attrs=new XmlAttributes();

 // добавляСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ элСмСнтов

 attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));

 attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));

 XmlAttributeOverrides attrOver=new XmlAttributeOverrides();

 //добавляСм ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Attributes (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²)

 attrOver.Add(typeof(Inventory), "InventoryItems", attrs);

 //Π½ΡƒΠΆΠ΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Inventory для дСсСриализаций Π² Π½Π΅Π³ΠΎ

 Inventory newInv;

 // дСсСриализуСм ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠΊΠ½ΠΎ списка ΠΈΠ·

 // дСсСриализованного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

 FileStream f=new FileStream("..\\..\\..\\inventory.xml", FileMode.Open);

 XmlSerializer newSr=new XmlSerializer(typeof(Inventory).attrOver);

 newInv=(Inventory)newSr.Deserialize(f);

 if (newInv!=null) {

  foreach(Product prod in newInv.InventoryItems) listBox1.Items.Add(prod.ProductName);

 }

 f.Close();

}


// это Ρ‚Π΅ ΠΆΠ΅ классы, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅

// Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

// ΠΈΠ· свойства InventoryItems для Inventory

public class Inventory {

 private Product[] stuff;

 public Inventory() {}

 public Product[] InventoryItems {

  get {return stuff;}

  set {stuff=value;}

 }

}


public class Product {

 private int prodId;

 private string prodName;

 private int suppId;

 public Product() {}

 public int ProductID {

  get {return prodId;}

  set {prodId=value;}

 }

 public string ProductName {

  get {return prodName;}

  set {prodName=value;}

 }

 public int SupplierID {

  get {return suppId;}

  set {suppId=value;}

 }

}


public class BookProduct:Product {

 private string isbnNum;

 public BookProduct() {}

 public string ISBN {

  get {return isbnNum;}

  set {isbnNum=value;}

 }

}

Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, Π½ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ,β€” здСсь Π½Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² класс Inventory Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ классы Inventory, Product ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс BookProduct находятся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ DLL, ΠΈ Ρƒ нас Π½Π΅Ρ‚ исходного ΠΊΠΎΠ΄Π°.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π² процСссС являСтся созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π° основС XmlAttributes, ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° XmlElementAttribute для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ:

XmlAttributes attrs=new XmlAttributes();

attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));

attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ добавляСм Π½ΠΎΠ²Ρ‹ΠΉ XmlElementAttribute ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ XmlElements класса XmlAttributes. Класс XmlAttributes ΠΈΠΌΠ΅Π΅Ρ‚ свойства, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ; XmlArray ΠΈ XmlArrayItems, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°Ρ€ΠΎΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ XmlAttributes с двумя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π½Π° основС XmlElementAttribute, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ XmlElements. Π”Π°Π»Π΅Π΅ создадим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ XmlAttributeOverrides:

XmlAttributeOverrides attrOver = new XmlAttributeOverride();

attrOver.Add(typeof(Inventory) , "Inventory Items", attrs);