.net中DataContract属性和Serializable属性的区别我正在尝试使用以下方法创建对象的深度克隆。publicstaticTDeepClone(thisTtarget){using(MemoryStreamstream=newMemoryStream()){BinaryFormatterformatter=newBinaryFormatter();格式化程序。序列化(流,目标);stream.Position=0;返回(T)格式化程序。反序列化(流);}}此方法需要一个序列化对象,即具有“可序列化”属性的类的对象。我有一个类,它有一个属性“DataContract”,但该方法不使用此属性。我认为“DataContract”也是一种序列化器,但可能与“Serializable”不同。有人可以告诉我两者之间的区别吗?另外请告诉我是否可以创建一个对象的深度克隆,该对象只有一个属性执行“DataContract”和“Serializable”属性的功能,或者创建深度克隆的不同方式?请帮忙!BinaryFormatter需要Serializable才能工作。DataContract和DataMember属性与DataContractSerializer一起使用。您可以使用两个序列化程序的属性来装饰类。DataContract适用于WCF,因此适用于.NET3.0+。在.net2.0或更低版本中,没有DataContract、DataMember属性,只有Seri??alizable。正如Oded所说,如果你想使用BinaryFormatter,你必须用Serializable修饰类型。我曾经通过反射对对象结构进行一些检查,以找到反序列化所需的所有程序集并将它们序列化以进行引导。通过一些工作,可以构建类似的深度复制方法。基本上你需要一个递归方法,沿着Dictionary来检测循环引用。在方法内部,您将像这样检查所有字段:;列表字段=type.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic);foreach(字段中的字段信息字段){objectnextInput=field.GetValue(input);if(nextInputisSystem.Collections.IEnumerable){System.Collections.IEnumeratorenumerator=(nextInputasSystem.Collections.IEnumerable).GetEnumerator();while(enumerator.MoveNext()){InspectRecursively(enumerator.Current,processedObjects);}}else{InspectRecursively(nextInput,processedObjects);}}}}为了完成这项工作,您需要添加一个输出对象和System.Runtime.Serialization.FormatterServices.GetUninitializedObject(Typetype)东西来创建每个字段值的最浅副本(即使没有复制引用)。最后,您可以使用field.SetValue(input,output)等设置每个字段。但是,此实现不支持反序列化支持的已注册事件处理程序。此外,如果其类的构造函数需要初始化除设置所有字段之外的任何内容,则层次结构中的每个对象都将被销毁。最后一点只适用于序列化,如果类有相应的实现,比如标记为[OnDeserialized]方法,实现ISerializable,....以上都是C#学习教程的分享:DataContract属性和.net中的Serializable属性如果内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
