无法克隆对象。序列化问题

时间:2012-08-21 18:30:05

标签: c# .net linq-to-sql serialization

我有一个由Linq2Sql生成的类:

public partial class BuyerOrder : INotifyPropertyChanging, INotifyPropertyChanged

我想克隆这个类的对象,就像它在this帖子中所做的那样。为此,我在未生成的文件中定义了部分类,我将其标记为可序列化:

[Serializable]
public partial class BuyerOrder    

但是当我打电话时

formatter.Serialize(stream, source);

我得到一个例外,说这个类没有标记为可序列化。我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果要序列化LINQ-to-SQL类型,请告诉代码生成可序列化数据。您可以在DBML中执行此操作,或者更简单地在设计器中执行此操作 - 只需将序列化模式设置为单向(这是DBML中根@Serialization元素的<Database>属性)。

这将生成适合与DataContractSerializer一起使用的属性标记; LINQ-to-SQL 设计可以使用DataContractSerializer进行序列化。 not 设计为可以使用BinaryFormatter进行序列化。

答案 1 :(得分:0)

从BuyerOrder派生的每个类也必须被装饰为[Serializable],以及序列化实例持有引用的所有对象(除非装饰为NonSerializable)。

该异常应该告诉您缺少serializable属性的类型。如果你不能或不想装饰所有课程,你需要更多的创意。

- 另一种可能性 -

一种选择是使用Implementing a generic deep-clone for C# objects中描述的技术。由于这可以完全在内存中完成,并且没有二进制格式化程序,因此它的执行速度比基于序列化的克隆快许多倍。

源代码位于http://csharptest.net/browse/src/Library/Cloning

只需两行代码:

using (ObjectCloner cloner = new SerializerClone())
    fooCopy = cloner.Clone(foo);