2008-12-01 64 views
14

我想序列化一些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的一個繼承類失敗是沒有的。這甚至有可能嗎?

回答

18

使用LINQ到SQL(從標籤) ,那麼是的:你可以將dmbl標記爲可序列化的,它使用[DataContract]/[DataMember]方法。您可以通過在設計師的「序列化模式」設置爲「單向」這樣做,或者你可以在DBML本身做到這一點:

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

然後可以使用的DataContractSerializer或NetDataContractSerializer寫這(如XML或二進制分別)。如果你需要一些可移植的(即不是MS/.NET專用的),那麼protobuf-net將使用「協議緩衝區」規範來序列化數據協定。

+2

我的天啊!它充滿了明星! – Mykroft 2008-12-02 15:27:08

+1

如何當我試圖做到這一點,並嘗試序列化到memcached,它不工作? :| – DucDigital 2010-01-23 17:02:15

2

Linq類是部分類。您可以更改定義,以紀念類作爲實施ISerializable,然後提供代碼...

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

仍有可能與反序列化的問題,但是,(我不是100%的這一點)。另一種方法是使用XML序列化和實現IXmlSerializable,這對序列化和反序列化,讓您全過程控制方法......

6

繼馬克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); 

的連接()調用填補了我的外鍵依賴關係和項目與數據上下文關聯。

相關問題