我想序列化一些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继承的类不是。甚至可以这样做吗?
答案 0 :(得分:18)
使用linq-to-sql(来自标签),然后是:您可以将dmbl标记为可序列化,它使用[DataContract] / [DataMember]方法。您可以通过在设计器中将“Serialization Mode”设置为“Unidirectional”来实现,或者您可以在dbml本身中执行此操作:
<Database ... Serialization="Unidirectional">...
然后,您可以使用DataContractSerializer或NetDataContractSerializer来编写它(分别为xml或二进制)。如果您需要可移植的东西(即不是特定于MS / .NET),那么protobuf-net将使用“协议缓冲区”规范序列化数据合同。
答案 1 :(得分:6)
按照Marc Gravell的建议,我编写了以下两段代码,这些代码块运行得很漂亮:
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()调用为我填写外键依赖项,并将该项与数据上下文相关联。
答案 2 :(得分:5)
答案 3 :(得分:2)
Linq类是部分类。您可以更改定义以将类标记为实现ISerializable,然后提供代码...
public partial class User : ISerializable
{
// implement GetObjectData here
}
反序列化可能仍然存在问题(但我不是100%)。另一种方法是使用xml序列化并实现IXmlSerializable,它具有序列化和反序列化的方法,允许您控制整个过程......