C#,struct,class,使用BinaryFormatter将对象序列化
2016-08-16 19:13
375 查看
拷贝的别人的代码
namespace ClassAndStructTest
{
//这是一个class,是一种引用类型,没有用Serializable进行标示,因此不能被序列化
class ClsA
{
public string s1;
public int i2;
}
[System.Serializable]//标示了这个类可以被序列化,这个类无法被继承
class ClsB
{
public string s1;
public int i2;
}
//这是一个struct,是一种值类型,
struct StructA
{
public string s1;
public int i2;
}
class Program
{
public static void Main()
{
//ca2和ca1共用了一块内存.
ClsA ca1 = new ClsA();
ca1.s1 = "ca1";
ClsA ca2 = ca1;
ca2.s1 = "ca2";
System.Console.WriteLine("ca1.s1={0}", ca1.s1);
//sa2和sa1使用了不同的内存.
StructA sa1 = new StructA();
sa1.s1 = "sa1";
StructA sa2 = sa1;
sa2.s1 = "sa2";
System.Console.WriteLine("sa1.s1={0}", sa1.s1);
//因为重新生成了一块内存,所以没啥说的,
ClsB cb1 = new ClsB();
cb1.s1 = "cb1";
ClsB cb2 = ObjectCopy.DeepCopy(cb1);
cb2.s1 = "cb2";
System.Console.WriteLine("cb1.s1={0}", cb1.s1);
return;
}
}
public class ObjectCopy : System.Object
{
/// <summary>
/// 代码来源http://bbs.csdn.net/topics/390307567
/// 深度拷贝,相当于new,也就是在内存中重新创建,不受原来属性的改变而改变
/// 错误消息: Additional information: 程序集“xxx”中的类型“yyy”未标记为可序列化。
/// 解决方案: [System.Serializable]
/// </summary>
public static T DeepCopy<T>(T obj)
{
T objResult;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
//该方法要求:如果当前类的某个属性也是一个对象,则要求该属性对象要序列化
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
= new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
objResult = (T)bf.Deserialize(ms);
}
return objResult;
}
/// <summary>
/// 该方法默认的是浅克隆,即不会克隆对象引用的对象[比如person属性中Address,或者是个整形数组],而只是简单地复制这个引用.
/// MemberwiseClone方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象.
/// 如果字段是值类型的,则对该字段执行逐位复制.如果字段是引用类型(字符串很特殊),则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象.
/// </summary>
public System.Object ShallowCopy()
{
return this.MemberwiseClone();
}
/// <summary>
/// 这个函数很显然运行时会抛出异常 -_-!
/// </summary>
public static T ShallowCopy<T>(T obj)
{
var x1 = (System.Object)obj;
var x2 = (ObjectCopy)x1;
var x3 = x2.ShallowCopy();
var x4 = (T)x3;
return x4;
}
}
}
完。
namespace ClassAndStructTest
{
//这是一个class,是一种引用类型,没有用Serializable进行标示,因此不能被序列化
class ClsA
{
public string s1;
public int i2;
}
[System.Serializable]//标示了这个类可以被序列化,这个类无法被继承
class ClsB
{
public string s1;
public int i2;
}
//这是一个struct,是一种值类型,
struct StructA
{
public string s1;
public int i2;
}
class Program
{
public static void Main()
{
//ca2和ca1共用了一块内存.
ClsA ca1 = new ClsA();
ca1.s1 = "ca1";
ClsA ca2 = ca1;
ca2.s1 = "ca2";
System.Console.WriteLine("ca1.s1={0}", ca1.s1);
//sa2和sa1使用了不同的内存.
StructA sa1 = new StructA();
sa1.s1 = "sa1";
StructA sa2 = sa1;
sa2.s1 = "sa2";
System.Console.WriteLine("sa1.s1={0}", sa1.s1);
//因为重新生成了一块内存,所以没啥说的,
ClsB cb1 = new ClsB();
cb1.s1 = "cb1";
ClsB cb2 = ObjectCopy.DeepCopy(cb1);
cb2.s1 = "cb2";
System.Console.WriteLine("cb1.s1={0}", cb1.s1);
return;
}
}
public class ObjectCopy : System.Object
{
/// <summary>
/// 代码来源http://bbs.csdn.net/topics/390307567
/// 深度拷贝,相当于new,也就是在内存中重新创建,不受原来属性的改变而改变
/// 错误消息: Additional information: 程序集“xxx”中的类型“yyy”未标记为可序列化。
/// 解决方案: [System.Serializable]
/// </summary>
public static T DeepCopy<T>(T obj)
{
T objResult;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
//该方法要求:如果当前类的某个属性也是一个对象,则要求该属性对象要序列化
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
= new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
objResult = (T)bf.Deserialize(ms);
}
return objResult;
}
/// <summary>
/// 该方法默认的是浅克隆,即不会克隆对象引用的对象[比如person属性中Address,或者是个整形数组],而只是简单地复制这个引用.
/// MemberwiseClone方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象.
/// 如果字段是值类型的,则对该字段执行逐位复制.如果字段是引用类型(字符串很特殊),则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象.
/// </summary>
public System.Object ShallowCopy()
{
return this.MemberwiseClone();
}
/// <summary>
/// 这个函数很显然运行时会抛出异常 -_-!
/// </summary>
public static T ShallowCopy<T>(T obj)
{
var x1 = (System.Object)obj;
var x2 = (ObjectCopy)x1;
var x3 = x2.ShallowCopy();
var x4 = (T)x3;
return x4;
}
}
}
完。
相关文章推荐
- 使用struct与使用class初始化对象效率对比
- 使用BinaryFormatter()序列化对象方法
- 对象序列化:使用XmlSerializer走完最后一步
- 对象序列化:使用XmlSerializer走完最后一步
- 关于axis 使用过程中传输对象序列化的问题
- c++对象模型笔记:struct 和 class
- 使用XmlSerializer类将对象序列化为Xml格式保存 - 支持泛型的Dictionary,list 等集合类型
- 序列化(串行化)- 使用BinaryFormatter进行序列化
- 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序
- 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。
- 使用XmlSerializer将对象序列化至XML文件中(VB.NET)
- 使用XML文件存取可序列化的对象的类
- 使用XmlSerializer类将对象序列化为Xml格式保存 - 支持泛型的Dictionary
- 当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象
- 使用XmlSerializer类将对象序列化为Xml格式保存_支持泛型的Dictionary
- 对象序列化:使用System.Xml.Serialization命名空间
- C#面象对象学习:类(class)与结构(struct)
- 创建对象的序列化文件 - SoapFormatter,binaryFormatter以及XmlSerializer序列化文件的比较
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化
- 对象序列化:使用System.Xml.Serialization命名空间(转)