2008-12-01 15 views
14

Me gustaría serializar algunos objetos generados por LINQ y almacenarlos en una tabla como un campo binario (nunca importa por qué). Me gustaría ser capaz de escribir un código que se ve algo como esto:¿Es posible serializar un objeto LINQ?

SerialTestDataContext db = new SerialTestDataContext(); 

relation_table row = db.relation_tables.First(); 

MemoryStream memStream = new MemoryStream(); 
BinaryFormatter bin = new BinaryFormatter(); 
bin.Serialize(memStream, row); 
Console.WriteLine("Serilized successfully"); 

TestTable tt = new testTable(); 
tt.data = new System.Data.Linq.Binary(memStream.ToArray()); 
db.testTables.InsertOnSubmit(tt); 
db.SubmitChanges(); 
Console.WriteLine("Inserted successfully"); 

Actualmente eso no funciona a pesar de que he marcado las clases generadas como [Serializable] porque uno de los LINQ heredaron clases no lo es. ¿Es posible hacer esto?

Respuesta

18

Con LINQ to SQL (de etiquetas) , entonces sí: puede marcar el dmbl como serializable, que utiliza el enfoque [DataContract]/[DataMember]. Esto se hace poniendo el "Modo de serialización" a "unidireccional" en el diseñador, o puede hacerlo en el dbml sí:

<Database ... Serialization="Unidirectional">... 

continuación, puede utilizar DataContractSerializer o NetDataContractSerializer de escribir esto (como XML o binario respectivamente). Si necesita algo portátil (es decir, no específico de MS/.NET), entonces protobuf-net serializará los contratos de datos utilizando la especificación de "búferes de protocolo".

+2

¡Dios mío! ¡Está lleno de estrellas! – Mykroft

+1

¿cómo es que cuando intenté hacer esto, y trato de serializar a memcached, no está funcionando? : | – DucDigital

+0

@DucDigital - ¿admite memcached 'DataContractSerializer'? ¿O simplemente usa 'BinaryFormatter'? En ese caso, debe agregar '[Serializable]'. Avísame ... –

2

Las clases de Linq son parciales. Puede cambiar la definición para marcar las clases como la implementación de ISerializable y luego proporcionar el código ...

public partial class User : ISerializable 
{ 
    // implement GetObjectData here 
} 

Hay aún puede haber problemas con la deserialización, sin embargo (no estoy 100% en esto). Una alternativa es utilizar la serialización XML y aplicar IXmlSerializable, que tiene métodos para serializar y deserializar, que le permite controlar todo el proceso ...

6

Siguiendo el consejo de Marc Gravell escribí las siguientes dos bloques de código que funcionó muy bien:

relation_table row = db.relation_tables.First(); 

MemoryStream memStream = new MemoryStream(); 
NetDataContractSerializer ndcs = new NetDataContractSerializer(); 
ndcs.Serialize(memStream, row); 

byte[] stuff = memStream.toArray(); 

memStream = new MemoryStream(stuff); 
row = ndcs.Deserialize(memStream); 

db.relation_tables.Attach(row); 
Console.WriteLine(row.data_table1.somedata + ": " + row.more_data); 

La Adjuntar() llamada rellena en las dependencias de clave externa para mí y Asocia el elemento con el contexto de datos.

+0

+1 esto funcionó para mí! –

+0

Hola, estoy tratando de usar el código de su ejemplo –

Cuestiones relacionadas