Serializando a un fichero de texto (XML-SOAP)

Ejercicio: realizar una serialización que nos guarde las notas de un determinado alumno:

Boletín notas: martes, 6 de mayo de 2014
***************************************************************
Juanjo Pedraza
C/ Perico Palotes, 33
03740 Gata de Gorgos (Alicante)


Asignatura            Ev1         Ev2        Ev3         Media
---------------------------------------------------------------
Entornos Desarrollo     3           2          1           2
Religión               10           8          9           9
---------------------------------------------------------------
                                                
                                                Firma entregado
                                   ****************************
                                   *                          *   
                                   *                          *
                                   ****************************

Ejemplo de Orden de Pedido.

using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
 
[XmlRootAttribute("OrdenPedido", Namespace="https://www.csharp.com.es", IsNullable = false)]
public class OrdenPedido
{
    public Direccion EnviarA;
    public string FechaOrden; 
    [XmlArrayAttribute("Items")]
    public LineasPedido[] LineasPedidos;
    public decimal SubTotal;
    public decimal CosteEntrega;
    public decimal CosteTotal;   
}
     
public class Direccion
{

    [XmlAttribute]
    public string Nombre;
    public string Linea1;
 
    // Avisamos a XmlSerializer que el atributo XML 
    // no aparezca si los campos están a nulos
    [XmlElementAttribute(IsNullable = false)]
    public string Poblacion;
    public string Provincia;
    public string CodigoPostal;
}
     
public class LineasPedido
{
    public string LineaPedido;
    public string Descripcion;
    public decimal PrecioUnitario;
    public int Cantidad;
    public decimal TotalLinea;
 
    // Calculamos el precio por línea y lo guardamos
    public void Calcular()
    {
        TotalLinea = PrecioUnitario * Cantidad;
    }
}
     
public class Test
{
    public static void Main()
    {
        // Escribimos y leemos el pedido
        Test t = new Test();
        t.CreamosOrdenPedido("OrdenPedido.xml");
        t.LeemosOrdenPedido("OrdenPedido.xml");
        Console.ReadKey();
    }
 
    private void CreamosOrdenPedido(string fichero)
    {

        XmlSerializer serializer = 
        new XmlSerializer(typeof(OrdenPedido));
        TextWriter writer = new StreamWriter(fichero);
        OrdenPedido op=new OrdenPedido();

        Direccion DireccionFactura = new Direccion();
        DireccionFactura.Nombre = "Juanjo Pedraza";
        DireccionFactura.Linea1 = "C/ Perico Palotes, 33.";
        DireccionFactura.Poblacion = "Gata de Gorgos";
        DireccionFactura.Provincia = "Alicante";
        DireccionFactura.CodigoPostal = "03740";

        op.EnviarA = DireccionFactura;
        op.FechaOrden = System.DateTime.Now.ToLongDateString();
     
        // Creamos líneas de pedido
        LineasPedido i1 = new LineasPedido();
        i1.LineaPedido = "MORCI";
        i1.Descripcion = "Morcillas de cebolla";
        i1.PrecioUnitario = (decimal) 5.23;
        i1.Cantidad = 3;
        i1.Calcular();
     
        // La insertamos en un array
        LineasPedido [] items = {i1};
        op.LineasPedidos = items;
        // Calculamos el total
        decimal subTotal = new decimal();
        foreach(LineasPedido oi in items)
        {
            subTotal += oi.TotalLinea;
        }
        op.SubTotal = subTotal;
        op.CosteEntrega = (decimal) 12.51; 
        op.CosteTotal = op.SubTotal + op.CosteEntrega; 
        serializer.Serialize(writer, op);
        writer.Close();
    }
     
    protected void LeemosOrdenPedido(string fichero)
    {

        XmlSerializer serializer = new XmlSerializer(typeof(OrdenPedido));

        serializer.UnknownNode+= new
        XmlNodeEventHandler(serializer_UnknownNode);
        serializer.UnknownAttribute+= new
        XmlAttributeEventHandler(serializer_UnknownAttribute);
     

        FileStream fs = new FileStream(fichero, FileMode.Open);

        OrdenPedido op;

        op = (OrdenPedido) serializer.Deserialize(fs);
 
        Console.WriteLine ("Fecha Orden: " + op.FechaOrden);
     
        Direccion EnviarA = op.EnviarA;
        ReadDireccion(EnviarA, "Enviar a:");
   
        LineasPedido [] items = op.LineasPedidos;
        Console.WriteLine("Líneas de la factura:");
        foreach(LineasPedido oi in items)
        {
            Console.WriteLine("\t"+
            oi.LineaPedido + "\t" + 
            oi.Descripcion + "\t" +
            oi.PrecioUnitario + "\t" +
            oi.Cantidad + "\t" +
            oi.TotalLinea);
        }
      
        Console.WriteLine(
        "\n\t\t\t\t\t Subtotal\t" + op.SubTotal + 
        "\n\t\t\t\t\t Transporte\t" + op.CosteEntrega + 
        "\n\t\t\t\t\t Total\t\t" + op.CosteTotal
        );
    }
     
    protected void ReadDireccion(Direccion a, string label)
    {
        // Leemos campos de la dirección
        Console.WriteLine(label);
        Console.Write("\t"+
        a.Nombre +"\n\t" +
        a.Linea1 +"\n\t" +
        a.Poblacion +"\t" +
        a.Provincia +"\n\t" +
        a.CodigoPostal +"\n");
    }
 
    protected void serializer_UnknownNode
    (object sender, XmlNodeEventArgs e)
    {
        Console.WriteLine("Nodo desconocido:" +   e.Name + "\t" + e.Text);
    }
 
    protected void serializer_UnknownAttribute
    (object sender, XmlAttributeEventArgs e)
    {
        System.Xml.XmlAttribute attr = e.Attr;
        Console.WriteLine("Atributo desconocido " + 
        attr.Name + "='" + attr.Value + "'");
    }
}

Fecha Orden: martes, 6 de mayo de 2014
Enviar a:
        Juanjo Pedraza
        C/ Perico Palotes, 33.
        Gata de Gorgos  Alicante
        03740
Líneas de la factura:
        MORCI   Morcillas de cebolla    5,23    3       15,69

                                         Subtotal       15,69
                                         Transporte     12,51
                                         Total          28,20