Можно ли сериализовать объект LINQ? - PullRequest
14 голосов
/ 02 декабря 2008

Я бы хотел сериализовать некоторые сгенерированные 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 - нет. Возможно ли это сделать?

Ответы [ 4 ]

18 голосов
/ 02 декабря 2008

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

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

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

6 голосов
/ 02 декабря 2008

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

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 () заполняет для меня зависимости внешнего ключа и связывает элемент с контекстом данных.

5 голосов
/ 02 декабря 2008
2 голосов
/ 02 декабря 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...