Можно ли сериализовать объект 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() заполняет внешние зависимости для меня и связывает элемент с контекстом данных.
Ответ 3
MSDN: Сериализация (LINQ to SQL)
Ответ 4
Классы Linq являются частичными классами. Вы можете изменить определение, чтобы пометить классы как реализующие ISerializable, а затем предоставить код...
public partial class User : ISerializable
{
// implement GetObjectData here
}
Тем не менее могут быть проблемы с десериализацией (я не 100% на этом). Альтернативой является использование сериализации xml и реализация IXmlSerializable, который имеет методы сериализации и десериализации, что позволяет вам контролировать весь процесс..