共用方式為


HOW TO:序列化和還原序列化物件 (Entity Framework)

實體資料模型 (EDM) 產生器工具 (EdmGen.exe) 和 Entity Data Model 精靈所產生的實體 (Entity) 類型都支援二進位序列化 (Serialization)。 當您將某個物件序列化成二進位資料流時,就會一併序列化目前載入物件內容中的所有相關物件。 如需詳細資訊,請參閱序列化物件 (Entity Framework)

本主題的範例是根據 Adventure Works Sales Model。 若要執行此範例中的程式碼,您必須已經將 AdventureWorks Sales Model 加入到專案中,並設定您的專案使用 Entity Framework。 若要這樣做,請完成 HOW TO:手動設定 Entity Framework 專案HOW TO:以手動方式定義 Entity Data Model (Entity Framework) 中的程序。 您也必須加入下列命名空間 (Namespace) 的 using 陳述式 (Visual Basic 中的 Imports):

範例

在這個範例中,SerializeToBinaryStream 方法會查詢 Contact 物件是否有指定的姓氏值,然後傳回二進位 MemoryStreamMemoryStream 包含 Contact 物件及其相關 SalesOrderHeaderSalesOrderDetail 物件的物件圖形。

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 = CType(formatter.Deserialize(stream), Contact)
            context.Attach(contact)

            ' Display information for each item 
            ' in the orders that belong to the contact.
            For Each order As SalesOrderHeader In contact.SalesOrderHeader
                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.SalesOrderDetail
                    Console.WriteLine(String.Format("Product:{0}" _
                        + "Quantity: {1}", item.ProductID.ToString(), _
                        item.OrderQty.ToString()))
                Next
            Next
        Catch ex As ApplicationException
            Console.WriteLine(ex.ToString())
        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 BinaryFormatter = New BinaryFormatter()
    Dim stream As MemoryStream = 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.Contact '.Include("SalesOrderHeader.SalesOrderDetail")

        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 ApplicationException("The object query failed", ex)
        Catch ex As EntityCommandExecutionException
            Throw New ApplicationException("The object query failed", ex)
        Catch ex As SerializationException
            Throw New ApplicationException("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.SalesOrderHeader)
            {
                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.SalesOrderDetail)
                {
                    Console.WriteLine(String.Format("Product: {0} "
                        + "Quantity: {1}", item.ProductID.ToString(),
                        item.OrderQty.ToString()));
                }
            }
        }
        catch (ApplicationException ex)
        {
            Console.WriteLine(ex.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.Contact.Include("SalesOrderHeader.SalesOrderDetail");

        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 ApplicationException("The object query failed", ex);
        }
        catch (EntityCommandExecutionException ex)
        {
            throw new ApplicationException("The object query failed", ex);
        }
        catch (SerializationException ex)
        {
            throw new ApplicationException("The object graph could not be serialized", ex);
        }

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

另請參閱

其他資源

使用物件 (Entity Framework 工作)