我有一个由Linq2Sql生成的类:
public partial class BuyerOrder : INotifyPropertyChanging, INotifyPropertyChanged
我想克隆这个类的对象,就像它在this帖子中所做的那样。为此,我在未生成的文件中定义了部分类,我将其标记为可序列化:
[Serializable]
public partial class BuyerOrder
但是当我打电话时
formatter.Serialize(stream, source);
我得到一个例外,说这个类没有标记为可序列化。我做错了什么?
答案 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);