Procédure : sérialiser et désérialiser des objets vers et à partir d'un flux binaire (Entity Framework)
Les types d'entités générés par l'outil de génération EDM (Entity Data Model ) (EdmGen.exe) et l'Assistant EDM prennent en charge la sérialisation binaire. Lorsque vous sérialisez un objet en flux binaire, tous les objets associés actuellement chargés dans le contexte de l'objet sont également sérialisés. Pour plus d'informations, voir Sérialisation d'objets (Entity Framework).
L'exemple de cette rubrique est basé sur le modèle de vente Adventure Works Sales Model. Pour exécuter le code de cet exemple, vous devez déjà avoir ajouté le modèle de vente AdventureWorks Sales Model à votre projet et configuré ce dernier pour qu'il utilise Entity Framework. Pour ce faire, exécutez les procédures décrites dans Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement les fichiers du modèle et les fichiers de mappage (Entity Framework). Vous devez aussi ajouter des instructions using (Imports en Visual Basic) pour les espaces de noms suivants :
Exemple
Dans cet exemple, une méthode SerializeToBinaryStream exécute une requête sur l'objet Contact à la recherche de la valeur de nom spécifiée, puis retourne un objet MemoryStream binaire. MemoryStream contient un graphique de l'objet Contact et des objets SalesOrderHeader et SalesOrderDetail qui lui sont associés.
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;
}
}