2011-03-16 50 views
0

我正在嘗試使用下面的代碼製作L2S實體的深層副本。我有.DBML的序列化模式設置爲單向。但是,當我嘗試使用下面顯示的DeepCopy方法制作L2S實體的深層副本時,出現錯誤,指出對象未標記爲可序列化。有人知道爲什麼Linq to Sql - 無法制作L2S實體的深層副本

public static T DeepCopy<T>(T obj) 
{ 
    object result = null; 

    using (var ms = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 
     formatter.Serialize(ms, obj); 
     ms.Position = 0; 

     result = (T)formatter.Deserialize(ms); 
     ms.Close(); 
    } 

    return (T)result; 
} 

我的一個L2S類定義如下所示:

[global::System.Data.Linq.Mapping.TableAttribute(Name="Polar.Recipe")] 
[global::System.Runtime.Serialization.DataContractAttribute()] 
public partial class RecipeRecord : INotifyPropertyChanging, INotifyPropertyChanged 
+0

爲什麼你需要做一個L2S對象的深層副本? – Mig

+0

只需使用DataContractSerializer。 – Marc

回答

1

DataContract屬性是DataContractSerializer所必需的,但不會與其他序列化器一起工作,如BinarySerializer,ViewStateSerializer和其他序列化器。爲了使它們工作,您必須使用Serializable屬性來應用它們。現在如何使這個容易...

當我想擴展我的Linq2Sql實體,我通常濫用事實,他們是所有部分類。所以,我創建文件Linq2SqlExtensions.cs

public partial class LinqEntity 
{ 
//extensions go here 
} 

等擴展功能(例如像數據上下文擴展)。現在如果你有很多實體你可以編寫一個小程序(甚至在PowerShell中)從你的Linq2Sql命名空間/程序集中提取所有類名(我祈禱你在另一個程序集中有它們)併爲你創建這個文件並自動更新它你每次都運行它從VisualStudio命令行(或msBuild腳本)。

var entities = Assembly.Load("MyLinqAssembly").GetTypes().Where(p=> p.IsDefined(typeof(TableAttribute), true)); 
WriteEntityCsFile(entities); 
0

你嘗試加入Serializable屬性到實體類? DataContract屬性可能僅允許通過WCF和其他通信服務進行序列化,而不使用BinaryFormatter。

另外,嘗試使用DataContractSerializer而不是BinaryFormatter。

+0

這些類是自動生成的。我將如何做到這一點? –