0

我有一个由 Linq2Sql 生成的类:

public partial class BuyerOrder : INotifyPropertyChanging, INotifyPropertyChanged

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

[Serializable]
public partial class BuyerOrder    

但是当我打电话时

formatter.Serialize(stream, source);

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

4

2 回答 2

1

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

这将生成适合与DataContractSerializer;一起使用的属性标记。LINQ-to-SQL旨在通过DataContractSerializer. 它不是设计为可序列化的BinaryFormatter.

于 2012-08-21T18:40:12.983 回答
0

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

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

——另一种可能——

一种选择是使用为 C# 对象实现通用深度克隆中描述的技术。由于这可以完全在内存中完成并且无需二进制格式化程序,因此它的执行速度将比基于序列化的克隆快很多倍。

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

它只需要两行代码:

using (ObjectCloner cloner = new SerializerClone())
    fooCopy = cloner.Clone(foo);
于 2012-08-21T18:40:53.563 回答