可以将LINQ对象序列化吗?

14

我想要将一些由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继承类不是[Serializable]的。这种情况是否可能发生?

4个回答

18
使用linq-to-sql(从标签中),是的:您可以将dmbl标记为可序列化,这使用[DataContract] / [DataMember]方法。您可以通过在设计器中设置“Serialization Mode”为“Unidirectional”或在dbml本身中执行此操作来实现此目的。
<Database ... Serialization="Unidirectional">...

你可以使用DataContractSerializer或NetDataContractSerializer将其写入(分别作为xml或二进制文件)。如果需要可移植性(即非MS / .NET特定),则protobuf-net将使用“协议缓冲区”规范序列化数据合同。


1
为什么当我尝试这样做并尝试将其序列化到Memcached时,它不起作用?:| - DucDigital
@DucDigital - memcached支持DataContractSerializer吗?还是只使用BinaryFormatter?如果是后者,您需要添加[Serializable]。请告诉我... - Marc Gravell
你必须在你的类中添加Serializable,但我的意思是,我无法序列化linq对象,即使我尝试使用几个包装器来确保是否可以保存到Memcached。我尝试改为单向,但没有帮助,你可以查看我在这个开放问题中的示例:https://dev59.com/e0vSa4cB1Zd3GeqPe4Kl。希望我们能解决这个问题,因为真的没有关于这个的文档。 - DucDigital
1
当使用NetDataContractSerializer进行序列化时,对于具有类型为EntitySet<T>的属性的实体似乎无法正常工作 :( - Oleks
非常感谢!你是最棒的! - CoderKK

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()方法会自动填充外键依赖项,并将该项与数据上下文关联。


3

Linq类是部分类。您可以更改定义以将类标记为实现ISerializable,然后提供代码...

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

然而,反序列化可能仍存在问题(我并不完全确定)。另一种选择是使用xml序列化并实现IXmlSerializable,它具有用于序列化和反序列化的方法,允许您控制整个过程...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接