Gewusst wie: Serialisieren und Deserialisieren von Objekten in bzw. aus binärem Stream (Entity Framework)
Vom Entity Data Model (EDM)-Generator-Tool (EdmGen.exe) und dem Entity Data Model-Assistenten generierte Entitätstypen unterstützen binäre Serialisierung. Wenn Sie ein Objekt zu einem Binärstream serialisieren, werden alle aktuell im Objektkontext geladenen Objekte ebenfalls serialisiert. Weitere Informationen finden Sie unter Serialisieren von Objekten (Entity Framework).
Das Beispiel in diesem Thema beruht auf dem AdventureWorks Sales-Modell. Um den Code in diesem Beispiel auszuführen, müssen Sie Ihrem Projekt bereits das "AdventureWorks Sales"-Modell hinzugefügt und das Projekt für die Verwendung von Entity Framework konfiguriert haben. Führen Sie dazu die Verfahren in Gewusst wie: Manuelles Konfigurieren eines Entity Framework-Projekts und Gewusst wie: Manuelles Definieren der Modell- und Zuordnungsdateien (Entity Framework) durch. Außerdem müssen Sie using-Anweisungen (Imports in Visual Basic) für die folgenden Namespaces hinzufügen:
Beispiel
In diesem Beispiel fragt eine SerializeToBinaryStream-Methode nach einem Contact-Objekt mit dem angegebenen Wert für den Nachnamen ab und gibt einen binären MemoryStream zurück. Der MemoryStream enthält ein Objektdiagramm des Contact-Objekts und der zugehörigen Objekte SalesOrderHeader und SalesOrderDetail.
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;
}
}