Можно ли сериализовать объект LINQ?

Я хотел бы сериализовать некоторые созданные 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");

В настоящее время это не удается, хотя я отметил сгенерированные классы как [Serializable], потому что один из унаследованных классов LINQ - нет. Возможно ли это сделать?

Ответы

Ответ 1

С linq-to-sql (из тегов), тогда да: вы можете пометить dmbl как сериализуемый, который использует подход [DataContract]/[DataMember]. Вы делаете это, установив "Режим сериализации" в "Unidirectional" в дизайнере, или вы можете сделать это в самом dbml:

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

Затем вы можете использовать DataContractSerializer или NetDataContractSerializer, чтобы написать это (как xml или binary соответственно). Если вам нужно что-то портативное (т.е. Не специфичное для MS/.NET), то protobuf-net будет сериализовать контракты данных, используя спецификацию "buffer buffers".

Ответ 2

Следуя совету Марка Гравелла, я написал следующие два блока кода, которые прекрасно работали:

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);

Вызов Attach() заполняет внешние зависимости для меня и связывает элемент с контекстом данных.

Ответ 4

Классы Linq являются частичными классами. Вы можете изменить определение, чтобы пометить классы как реализующие ISerializable, а затем предоставить код...

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

Тем не менее могут быть проблемы с десериализацией (я не 100% на этом). Альтернативой является использование сериализации xml и реализация IXmlSerializable, который имеет методы сериализации и десериализации, что позволяет вам контролировать весь процесс..