XML 序列化和反序列化详例代码

  这是一个使用序列化和反序列化的详细例子来操作复杂的XML数据,其中还举例数组和List的使用方法和区别。 

 

  1
  2 using  System.Xml;
  3 using  System.Xml.Serialization;
  4 using  System.IO;
  5
  6 namespace  SerializableTest
  7 {
  8    
  9
 10    // The XmlRootAttribute allows you to set an alternate name 
 11    // (PurchaseOrder) for the XML element and its namespace. By 
 12    // default, the XmlSerializer uses the class name. The attribute 
 13    // also allows you to set the XML namespace for the element. Lastly,
 14    // the attribute sets the IsNullable property, which specifies whether 
 15    // the xsi:null attribute appears if the class instance is set to 
 16    // a null reference.
 17    
 18    
 19    //[XmlRootAttribute("PurchaseOrder", Namespace = "http://www.cpandl.com", IsNullable = false)]
 20    [XmlRootAttribute("PurchaseOrder")]
 21    [XmlInclude(typeof(OrderedItem))]
 22    public class PurchaseOrder
 23    {
 24        public Address ShipTo;
 25        public string OrderDate;
 26        
 27        // The XmlArrayAttribute changes the XML element name
 28        // from the default of "OrderedItems" to "Items".
 29        [XmlArrayAttribute("Items")]
 30        public OrderedItem[] OrderedItems;        
 31        [XmlArrayAttribute("Items2")]
 32        public List<OrderedItem> OrderedItemList;
 33        
 34        public decimal SubTotal;
 35        public decimal ShipCost;
 36        public decimal TotalCost;
 37    }

 38
 39    public class Address
 40    {
 41        // The XmlAttribute instructs the XmlSerializer to serialize the 
 42        // Name field as an XML attribute instead of an XML element (the 
 43        // default behavior).
 44        [XmlAttribute]
 45        public string Name;
 46        public string Line1;
 47
 48        // Setting the IsNullable property to false instructs the 
 49        // XmlSerializer that the XML attribute will not appear if 
 50        // the City field is set to a null reference.
 51        [XmlElementAttribute(IsNullable = false)]
 52        public string City;
 53        public string State;
 54        public string Zip;
 55    }

 56
 57    public class OrderedItem
 58    {
 59        [XmlAttribute("Name")]
 60        public string ItemName;
 61        public string Description;
 62        public decimal UnitPrice;
 63        public int Quantity;
 64        public decimal LineTotal;
 65
 66        // Calculate is a custom method that calculates the price per item
 67        // and stores the value in a field.
 68        public void Calculate()
 69        {
 70            LineTotal = UnitPrice * Quantity;
 71        }

 72    }

 73
 74    public class Test
 75    {
 76        public static void Main()
 77        {
 78            // Read and write purchase orders.
 79            Test t = new Test();
 80            t.CreatePO("po.xml");
 81            t.ReadPO("po.xml");
 82            Console.Read();
 83        }

 84
 85        private void CreatePO(string filename)
 86        {
 87            // Creates an instance of the XmlSerializer class;
 88            // specifies the type of object to serialize.
 89            XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder));
 90            TextWriter writer = new StreamWriter(filename);
 91            PurchaseOrder po = new PurchaseOrder();
 92
 93            // Creates an address to ship and bill to.
 94            Address billAddress = new Address();
 95            billAddress.Name = "Teresa Atkinson";
 96            billAddress.Line1 = "1 Main St.";
 97            billAddress.City = "AnyTown";
 98            billAddress.State = "WA";
 99            billAddress.Zip = "00000";
100            // Sets ShipTo and BillTo to the same addressee.
101            po.ShipTo = billAddress;
102            po.OrderDate = System.DateTime.Now.ToLongDateString();
103
104            // Creates an OrderedItem.
105            OrderedItem i1 = new OrderedItem();
106            i1.ItemName = "Widget S_1";
107            i1.Description = "Small widget";
108            i1.UnitPrice = (decimal)5.23;
109            i1.Quantity = 3;
110            i1.Calculate();
111
112            // Creates an OrderedItem.
113            OrderedItem i2 = new OrderedItem();
114            i2.ItemName = "Widget S_2";
115            i2.Description = "Small widget_2";
116            i2.UnitPrice = (decimal)25.23;
117            i2.Quantity = 3;
118            i2.Calculate();
119
120            // Inserts the item into the array.           
121            OrderedItem[] items = { i1,i2 };
122
123            po.OrderedItemList = new List<OrderedItem>();
124            po.OrderedItemList.Add(i1);
125            po.OrderedItemList.Add(i2);
126
127            po.OrderedItems = items;
128            // Calculate the total cost.
129            decimal subTotal = new decimal();
130            foreach (OrderedItem oi in items)
131            {
132                subTotal += oi.LineTotal;
133            }

134            po.SubTotal = subTotal;
135            po.ShipCost = (decimal)12.51;
136            po.TotalCost = po.SubTotal + po.ShipCost;
137            // Serializes the purchase order, and closes the TextWriter.
138            serializer.Serialize(writer, po);
139            writer.Close();
140        }

141
142        protected void ReadPO(string filename)
143        {
144            // Creates an instance of the XmlSerializer class;
145            // specifies the type of object to be deserialized.
146            XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder));
147            // If the XML document has been altered with unknown 
148            // nodes or attributes, handles them with the 
149            // UnknownNode and UnknownAttribute events.
150            serializer.UnknownNode += new
151            XmlNodeEventHandler(serializer_UnknownNode);
152            serializer.UnknownAttribute += new
153            XmlAttributeEventHandler(serializer_UnknownAttribute);
154
155            // A FileStream is needed to read the XML document.
156            FileStream fs = new FileStream(filename, FileMode.Open);
157            // Declares an object variable of the type to be deserialized.
158            PurchaseOrder po;
159            // Uses the Deserialize method to restore the object's state 
160            // with data from the XML document. */
161            po = (PurchaseOrder)serializer.Deserialize(fs);
162            // Reads the order date.
163            Console.WriteLine("OrderDate: " + po.OrderDate);
164
165            // Reads the shipping address.
166            Address shipTo = po.ShipTo;
167            ReadAddress(shipTo, "Ship To:");
168            // Reads the list of ordered items.
169            OrderedItem[] items = po.OrderedItems;
170            Console.WriteLine("Items to be shipped:");
171            foreach (OrderedItem oi in items)
172            {
173                Console.WriteLine("\t" +
174                oi.ItemName + "\t" +
175                oi.Description + "\t" +
176                oi.UnitPrice + "\t" +
177                oi.Quantity + "\t" +
178                oi.LineTotal);
179            }

180            // Reads the subtotal, shipping cost, and total cost.
181            Console.WriteLine(
182            "\n\t\t\t\t\t Subtotal\t" + po.SubTotal +
183            "\n\t\t\t\t\t Shipping\t" + po.ShipCost +
184            "\n\t\t\t\t\t Total\t\t" + po.TotalCost
185            );
186        }

187
188        protected void ReadAddress(Address a, string label)
189        {
190            // Reads the fields of the Address.
191            Console.WriteLine(label);
192            Console.Write("\t" +
193            a.Name + "\n\t" +
194            a.Line1 + "\n\t" +
195            a.City + "\t" +
196            a.State + "\n\t" +
197            a.Zip + "\n");
198        }

199
200        protected void serializer_UnknownNode
201        (object sender, XmlNodeEventArgs e)
202        {
203            Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text);
204        }

205
206        protected void serializer_UnknownAttribute
207        (object sender, XmlAttributeEventArgs e)
208        {
209            System.Xml.XmlAttribute attr = e.Attr;
210            Console.WriteLine("Unknown attribute " +
211            attr.Name + "='" + attr.Value + "'");
212        }

213    }

214}

215

你可能感兴趣的:(反序列化)