Compartir a través de


Cómo: Serializar y deserializar objetos hacia y desde una secuencia binaria (Entity Framework)

Los tipos de entidad que genera la herramienta de generación de Entity Data Model (EDM) (EdmGen.exe) y el asistente de Entity Data Model permiten la serialización binaria. Al serializar un objeto en una secuencia binaria, todos los objetos relacionados que estén cargados en el contexto del objeto también se serializarán. Para obtener más información, vea Serializar objetos (Entity Framework).

El ejemplo de este tema se basa en el modelo AdventureWorks Sales. Para ejecutar el código de este ejemplo, debe haber agregado ya el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para usar Entity Framework. Para ello, complete los procedimientos de Cómo configurar manualmente un proyecto de Entity Framework y Cómo: Definir manualmente los archivos de asignación y modelo (Entity Framework). También debe agregar instrucciones using (Imports en Visual Basic) para los siguientes espacios de nombres:

Ejemplo

En este ejemplo, un método SerializeToBinaryStream consulta al objeto Contact el valor del apellido especificado, y devuelve un MemoryStream binario. MemoryStream contiene un grafo de objetos del objeto Contact y sus objetos SalesOrderHeader y SalesOrderDetail relacionados.

Public Shared Sub ReadFromBinaryStream()
    Dim formatter As New BinaryFormatter()
    Using context As New AdventureWorksEntities()
        Try
            ' Get the object graph for the selected customer 
            ' as a binary stream. 
            Dim stream As MemoryStream = SerializeToBinaryStream("Adams")

            ' Read from the begining of the stream. 
            stream.Seek(0, SeekOrigin.Begin)

            ' Deserialize the customer graph from the binary stream 
            ' and attach to an ObjectContext. 
            Dim contact As Contact = DirectCast(formatter.Deserialize(stream), Contact)
            context.Attach(contact)

            ' Display information for each item 
            ' in the orders that belong to the first contact. 
            For Each order As SalesOrderHeader In contact.SalesOrderHeaders
                Console.WriteLine(String.Format("PO Number: {0}", order.PurchaseOrderNumber))
                Console.WriteLine(String.Format("Order Date: {0}", order.OrderDate.ToString()))
                Console.WriteLine("Order items:")
                For Each item As SalesOrderDetail In order.SalesOrderDetails
                    Console.WriteLine(String.Format("Product: {0}, Quantity: {1}", _
                                                      item.ProductID.ToString(), item.OrderQty.ToString()))
                Next
            Next
        Catch ex As SerializationException
            Console.WriteLine("The object graph could not be deserialized from " & _
                              "the binary stream because of the following error:")
            Console.WriteLine(ex.ToString())
        End Try
    End Using
End Sub
Private Shared Function SerializeToBinaryStream(ByVal lastName As String) As MemoryStream
    Dim formatter As New BinaryFormatter()
    Dim stream As New MemoryStream()

    Using context As New AdventureWorksEntities()
        ' Specify a timeout for queries in this context, in seconds. 
        context.CommandTimeout = 120

        ' Define a customer contact. 
        Dim customer As Contact

        ' Create a Contact query with a path that returns 
        ' orders and items for a contact. 
        Dim query As ObjectQuery(Of Contact) = context.Contacts.Include("SalesOrderHeaders.SalesOrderDetails")

        Try
            ' Return the first contact with the specified last name 
            ' along with its related orders and items. 
            customer = query.Where("it.LastName = @lastname", New ObjectParameter("lastname", lastName)).First()

            ' Serialize the customer object graph. 
            formatter.Serialize(stream, customer)
        Catch ex As EntitySqlException
            Throw New InvalidOperationException("The object query failed", ex)
        Catch ex As EntityCommandExecutionException
            Throw New InvalidOperationException("The object query failed", ex)
        Catch ex As SerializationException
            Throw New InvalidOperationException("The object graph could not be serialized", ex)
        End Try

        ' Return the streamed object graph. 
        Return stream
    End Using
End Function
public static void ReadFromBinaryStream()
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (AdventureWorksEntities context = new AdventureWorksEntities())
    {
        try
        {
            // Get the object graph for the selected customer
            // as a binary stream.
            MemoryStream stream = SerializeToBinaryStream(@"Adams");

            // Read from the begining of the stream.
            stream.Seek(0, SeekOrigin.Begin);

            // Deserialize the customer graph from the binary stream
            // and attach to an ObjectContext.
            Contact contact = (Contact)formatter.Deserialize(stream);
            context.Attach(contact);

            // Display information for each item 
            // in the orders that belong to the first contact.
            foreach (SalesOrderHeader order in contact.SalesOrderHeaders)
            {
                Console.WriteLine(String.Format("PO Number: {0}",
                    order.PurchaseOrderNumber));
                Console.WriteLine(String.Format("Order Date: {0}",
                    order.OrderDate.ToString()));
                Console.WriteLine("Order items:");
                foreach (SalesOrderDetail item in order.SalesOrderDetails)
                {
                    Console.WriteLine(String.Format("Product: {0} "
                        + "Quantity: {1}", item.ProductID.ToString(),
                        item.OrderQty.ToString()));
                }
            }
        }

        catch (SerializationException ex)
        {
            Console.WriteLine("The object graph could not be deserialized from "
                          + "the binary stream because of the following error:");
            Console.WriteLine(ex.ToString());
        }
    }
}
private static MemoryStream SerializeToBinaryStream(string lastName)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream stream = new MemoryStream();

    using (AdventureWorksEntities context = new AdventureWorksEntities())
    {
        // Specify a timeout for queries in this context, in seconds.
        context.CommandTimeout = 120;

        // Define a customer contact.
        Contact customer;

        // Create a Contact query with a path that returns 
        // orders and items for a contact.
        ObjectQuery<Contact> query =
            context.Contacts.Include("SalesOrderHeaders.SalesOrderDetails");

        try
        {
            // Return the first contact with the specified last name
            // along with its related orders and items.
            customer = query.Where("it.LastName = @lastname",
                new ObjectParameter("lastname", lastName)).First();

            // Serialize the customer object graph.
            formatter.Serialize(stream, customer);
        }
        catch (EntitySqlException ex)
        {
            throw new InvalidOperationException("The object query failed", ex);
        }
        catch (EntityCommandExecutionException ex)
        {
            throw new InvalidOperationException("The object query failed", ex);
        }
        catch (SerializationException ex)
        {
            throw new InvalidOperationException("The object graph could not be serialized", ex);
        }

        // Return the streamed object graph.
        return stream;
    }
}

Vea también

Conceptos

Trabajar con objetos (Entity Framework)