c#反as3 序列化 类对象is not marked as serializable怎么解决

序列化/反序列化,中文例句,英文例句-词都网
说明:双击或选中下面任意单词,将显示该词的音标、读音、翻译等;选中中文或多个词,将显示翻译。
您的位置: ->
-> 序列化/反序列化
Improved speed of the serializer/deserializer.
加快了序列化/反序列化的速度
Serialization will not deserialize delegates to non-public methods.
序列化不会反序列化非公共方法的委托。
Cannot deserialize the message passed as an argument. Cannot recognize the serialization format.
无法将作为参数传递的消息反序列化。无法识别序列化格式。
The application does not have sufficent permission to deserialize this stream.
应用程序没有反序列化该流的足够权限。
computerized sequencer
计算机化序列发生器
Insufficient state to deserialize the object.
More information is needed.
反序列化对象的状态不足。需要详细信息。
The constructor to deserialize an object of type {0} was not found.
未找到反序列化 {0} 类型对象的构造函数。
Study on sequence of strengthening buffer operator based on back cumulative-sum method
基于反向累积法的强化缓冲算子序列的研究
Stationary and Minimizing Sequences of Nonsmooth Constrained Optimization P
非光滑约束最优化的稳定序列和最小值序列
Study on septic tank wastewater treatment in granular SBR
颗粒化序列间歇式活性污泥反应器工艺处理化粪池污水
The more varied the organisms, the more varied the DNA sequences.
生物变化越多,DNA序列的变化也就越多。
Cannot serialize object of type '{0}'. The object does not have serializable members.
无法序列化类型“{0}”的对象。该对象没有可序列化的成员。
Incompatible change: Serialized object did not have the serializable superClass %1
不兼容的更改: 序列化的对象没有可序列化的超类 %1
The type {0} in Assembly {1} is not marked as serializable.
程序集 {1} 中的类型 {0} 未标记为可序列化。
Specifies the set of possible types that will
be deserialized by the formatter from the message provided.
指定可能由格式化程序从所提供的消息中进行反序列化的类型的集合。
Fixed a bug in WDDX deserialization that would sometimes corrupt the root element if it was a scalar one.
修正了 WDDX 反序列化时如果是标量可能破坏根元素的问题
Wrong number of Members. Object {0} has {1} members, number of members deserialized is {2}.
成员数错误。对象{0}有{1}个成员,而反序列化的成员数为{2}。
Possible Version mismatch. Type {0} has {1} members, number of members deserialized is {2}.
可能版本不匹配。类型{0}有{1}个成员,而反序列化的成员数为{2}。您的位置: >>
对c#序列化和反序列化的三种方式进行了举例说明。当然您也可以决定一个类中那些属性序列化或不序列化,可以通过使用 NonSerialized 属性标记成员变量来防止它们被序列化,具体内容请查阅相关资料。
&&&& 序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
&&&& 我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
&&&& .NET公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
&&&& 在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化。本文就通过一个小例子主要说说这三种方法的具体使用和异同点。
新建一个vs2008控制台工程SerializableTest,添加一个Person类,加上[Serializable]使其可以被序列化
using System.Collections.G
using System.L
using System.T
namespace SerializableTest
[Serializable]
public class Person
public string Sno { }
public string Name { }
public string Sex { }
public int Age { }
public string DisplayInfo()
return "我的学号是:" +Sno+ "\n我的名字是:"+Name + "\n我的性别为:"+Sex+"\n我的年龄:"+Age+"\n";
一、BinaryFormatter序列化方式
1、序列化:新建一个Person对象me,然后将其序列化保存到文件personInfo.txt中]
var me = new Person
Sno = "200719",
Name = "yuananyun",
Sex="man",
//创建一个格式化程序的实例
IFormatter formatter = new BinaryFormatter();
//创建一个文件流
Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, me);
stream.Close();
执行以上代码将创建一个personInfo.txt文件,它包含了me对象的程序集信息、类名和字段信息。
2、反序列化:从文件personInfo.txt中还原一个对象
//反序列化
Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open,
FileAccess.Read, FileShare.Read);
var stillme = (Person)formatter.Deserialize(destream);
stream.Close();
整个程序如下:
using System.IO;
using System.Runtime.S
using System.Runtime.Serialization.Formatters.B
namespace SerializableTest
class Program
static void Main(string[] args)
//创建一个格式化程序的实例
IFormatter formatter = new BinaryFormatter();
Console.WriteLine("对象序列化开始&&");
var me = new Person
Sno = "200719",
Name = "yuananyun",
Sex="man",
//创建一个文件流
Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, me);
stream.Close();
Console.WriteLine("序列化结束!\n");
Console.WriteLine("反序列化开始&&");
//反序列化
Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open,
FileAccess.Read, FileShare.Read);
var stillme = (Person)formatter.Deserialize(destream);
stream.Close();
Console.WriteLine("反序列化结束,输出对象信息&&");
Console.WriteLine(stillme.DisplayInfo());
Console.ReadKey();
运行结果如下:
&注意:反序列化还原对象时,并不会调用Person类的构造函数
二、SoapFormatter序列化方式
与BinaryFormatter序列化方式类似,只需要把IFormatter formatter = new BinaryFormatter()改成&IFormatter formatter = new SoapFormatter(),并且引用程序集System.Runtime.Serialization.Formatters.Soap.dll(.net自带的)
using System.IO;
using System.Runtime.S
using System.Runtime.Serialization.Formatters.S
namespace SerializableTest
class Program
static void Main(string[] args)
//创建一个格式化程序的实例
IFormatter formatter = new SoapFormatter();
Console.WriteLine("对象序列化开始&&");
var me = new Person
Sno = "200719",
Name = "yuananyun",
Sex="man",
//创建一个文件流
Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, me);
stream.Close();
Console.WriteLine("序列化结束!\n");
Console.WriteLine("反序列化开始&&");
//反序列化
Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open,
FileAccess.Read, FileShare.Read);
var stillme = (Person)formatter.Deserialize(destream);
stream.Close();
Console.WriteLine("反序列化结束,输出对象信息&&");
Console.WriteLine(stillme.DisplayInfo());
Console.ReadKey();
结果与第一种方式一样。
序列化之后的文件是Soap格式的文件(简单对象访问协议(Simple Object Access Protocol,SOAP),是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。),其内容如下:
&SOAP-ENV:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:SOAP-ENC="" xmlns:SOAP-ENV="" xmlns:clr="" SOAP-ENV:encodingStyle=""&&SOAP-ENV:Body&&a1:Person id="ref-1" xmlns:a1=""&&_x003C_Sno_x003E_k__BackingField id="ref-3"&200719&/_x003C_Sno_x003E_k__BackingField&&_x003C_Name_x003E_k__BackingField id="ref-4"&yuananyun&/_x003C_Name_x003E_k__BackingField&&_x003C_Sex_x003E_k__BackingField id="ref-5"&man&/_x003C_Sex_x003E_k__BackingField&&_x003C_Age_x003E_k__BackingField&22&/_x003C_Age_x003E_k__BackingField&&/a1:Person&&/SOAP-ENV:Body&&/SOAP-ENV:Envelope&三、XML序列化方式
using System.IO;
using System.Runtime.S
using System.Xml.S
namespace SerializableTest
class Program
static void Main(string[] args)
//创建一个格式化程序的实例
XmlSerializer formatter = new XmlSerializer(typeof(Person));
Console.WriteLine("对象序列化开始&&");
var me = new Person
Sno = "200719",
Name = "yuananyun",
Sex="man",
//创建一个文件流
Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, me);
stream.Close();
Console.WriteLine("序列化结束!\n");
Console.WriteLine("反序列化开始&&");
//反序列化
Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open,
FileAccess.Read, FileShare.Read);
var stillme = (Person)formatter.Deserialize(destream);
stream.Close();
Console.WriteLine("反序列化结束,输出对象信息&&");
Console.WriteLine(stillme.DisplayInfo());
Console.ReadKey();
结果与上述相同,xml序列化之后的文件就是一般的一个xml文件,personInfo.txt内容如下:
&?xml version="1.0"?&&Person xmlns:xsi="" xmlns:xsd=""&& &Sno&200719&/Sno&& &Name&yuananyun&/Name&& &Sex&man&/Sex&& &Age&22&/Age&&/Person&
注意:采用xml序列化的方式只能保存public的字段和可读写的属性,对于private等类型的字段不能进行序列化
下面进行验证
将Person的Name属性改成Private,然后查看生成的personInfo.text,其内容如下:
&?xml version="1.0"?&&Person xmlns:xsi="" xmlns:xsd=""&& &Sno&200719&/Sno&& &Sex&man&/Sex&& &Age&22&/Age&&/Person&
可以看到Name属性并没有出现在该文件中,反序列化生成的对象中Name属性值为NULL。
以上对c#序列化和反序列化的三种方式进行了举例说明。当然您也可以决定一个类中那些属性序列化或不序列化,可以通过使用 NonSerialized 属性标记成员变量来防止它们被序列化,具体内容请查阅相关资料。
.NET技术热门文章
.NET技术最新文章C# 序列化与反序列化保存类实例_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C# 序列化与反序列化保存类实例
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢序列化概述:
  序列化 (Serialization)将的状态信息转换为可以存储或传输的形式的过程。在序列化期间,将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
  序列化使其他代码可以查看或修改那些不序列化便无法访问的实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Intranet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。
  通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置状态,这也与可访问性规则无关。
对于任何可能包含重要的安全性数据的,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。
序列化目的:
1、以某种存储形式使自定义;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
  序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。&&&&.NET框架提供了两种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用SoapFormatter进行串行化;3、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储;第三种其实和第二种差不多也是XML的格式存储,只不过比第二种的XML格式要简化很多(去掉了SOAP特有的额外信息)。&&&&可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、2可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。&&&&1、使用BinaryFormatter进行串行化&&&&下面是一个可串行化的类:
using System.D
using System.C
using System.W
using System.Web.S
using System.Web.UI;
using System.Web.UI.WebC
using System.Web.UI.WebControls.WebP
using System.Web.UI.HtmlC
using System.IO;
using System.Runtime.Serialization.Formatters.B
/// &summary&
/// ClassToSerialize 的摘要说明
/// &/summary&
[Serializable]
public class ClassToSerialize
public int id = 100;
public string name = "Name";
[NonSerialized]
public string Sex = "男";
下面是串行化和反串行化的方法:
public void SerializeNow()
ClassToSerialize c = new ClassToSerialize();
FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(fileStream, c);
fileStream.Close();
public void DeSerializeNow()
ClassToSerialize c = new ClassToSerialize();
c.Sex = "kkkk";
FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryFormatter b = new BinaryFormatter();
c = b.Deserialize(fileStream) as ClassToS
Response.Write(c.name);
Response.Write(c.Sex);
fileStream.Close();
调用上述两个方法就可以看到串行化的结果:Sex属性因为被标志为[NonSerialized],故其值总是为null。&&&&2、使用SoapFormatter进行串行化&&&&和BinaryFormatter类似,我们只需要做一下简单修改即可:&&&&a.将using语句中的.Formatter.Binary改为.Formatter.S&&&&b.将所有的BinaryFormatter替换为SoapFormatter.&&&&c.确保报存文件的扩展名为.xml&&&&经过上面简单改动,即可实现SoapFormatter的串行化,这时候产生的文件就是一个xml格式的文件。&&&&3、使用XmlSerializer进行串行化&&&&关于格式化器还有一个问题,假设我们需要XML,但是不想要SOAP特有的额外信息,那么我们应该怎么办呢?有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。&&&&如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:&&&&a.添加System.Xml.Serialization命名空间。&&&&b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。&&&&c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。&&&&下面看示例:&&&&要序列化的类:
using System.D
using System.C
using System.W
using System.Web.S
using System.Web.UI;
using System.Web.UI.WebC
using System.Web.UI.WebControls.WebP
using System.Web.UI.HtmlC
using System.Xml.S
[Serializable]
public class Person
private string
public string Name
public string S
public int Age = 31;
public Course[] C
public Person()
public Person(string Name)
Sex = "男";
[Serializable]
public class Course
public string N
[XmlIgnore]
public string D
public Course()
public Course(string name, string description)
Description =
&序列化和反序列化方法:
public void XMLSerialize()
Person c = new Person("cyj");
c.Courses = new Course[2];
c.Courses[0] = new Course("英语", "交流工具");
c.Courses[1] = new Course("数学","自然科学");
XmlSerializer xs = new XmlSerializer(typeof(Person));
Stream stream = new FileStream("c:\\cyj.XML",FileMode.Create,FileAccess.Write,FileShare.Read);
xs.Serialize(stream,c);
stream.Close();
public void XMLDeserialize()
XmlSerializer xs = new XmlSerializer(typeof(Person));
Stream stream = new FileStream("C:\\cyj.XML",FileMode.Open,FileAccess.Read,FileShare.Read);
Person p = xs.Deserialize(stream) as P
Response.Write(p.Name);
Response.Write(p.Age.ToString());
Response.Write(p.Courses[0].Name);
Response.Write(p.Courses[0].Description);
Response.Write(p.Courses[1].Name);
Response.Write(p.Courses[1].Description);
stream.Close();
这里Course类的Description属性值将始终为null,生成的xml文档中也没有该节点,如下图:
&?xml version="1.0"?&
&Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&
&Sex&男&/Sex&
&Age&31&/Age&
&Name&英语&/Name&
&Description&交流工具&/Description&
&Name&数学&/Name&
&Description&自然科学&/Description&
&/Courses&
&Name&cyj&/Name&
&4、自定义序列化&&&&如果你希望让用户对类进行串行化,但是对数据流的组织方式不完全满意,那么可以通过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法,GetObjectData. 这个方法用于将对类对象进行串行化所需要的数据填进SerializationInfo对象。你使用的格式化器将构造SerializationInfo对象,然后在串行化时调用GetObjectData. 如果类的父类也实现了ISerializable,那么应该调用GetObjectData的父类实现。&&&&如果你实现了ISerializable,那么还必须提供一个具有特定原型的构造器,这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的,以防止粗心的开发人员直接使用它。&&&&示例如下:&&&&实现ISerializable的类:
using System.D
using System.C
using System.W
using System.Web.S
using System.Web.UI;
using System.Web.UI.WebC
using System.Web.UI.WebControls.WebP
using System.Web.UI.HtmlC
using System.Runtime.S
using System.Runtime.Serialization.Formatters.B
/// &summary&
/// Employee 的摘要说明
/// &/summary&
[Serializable]
public class Employee:ISerializable
public int EmpId=100;
public string EmpName="刘德华";
[NonSerialized]
public string NoSerialString = "NoSerialString-Test";
public Employee()
// TODO: 在此处添加构造函数逻辑
private Employee(SerializationInfo info, StreamingContext ctxt)
EmpId = (int)info.GetValue("EmployeeId", typeof(int));
EmpName = (String)info.GetValue("EmployeeName",typeof(string));
//NoSerialString = (String)info.GetValue("EmployeeString",typeof(string));
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
info.AddValue("EmployeeId", EmpId);
info.AddValue("EmployeeName", EmpName);
//info.AddValue("EmployeeString", NoSerialString);
&序列化和反序列化方法:
public void OtherEmployeeClassTest()
Employee mp = new Employee();
mp.EmpId = 10;
mp.EmpName = "邱枫";
mp.NoSerialString = "你好呀";
Stream steam = File.Open("c:\\temp3.dat", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
Response.Write("Writing Employee Info:");
bf.Serialize(steam,mp);
steam.Close();
mp = null;
//反序列化
Stream steam2 = File.Open("c:\\temp3.dat", FileMode.Open);
BinaryFormatter bf2 = new BinaryFormatter();
Response.Write("Reading Employee Info:");
Employee mp2 = (Employee)bf2.Deserialize(steam2);
steam2.Close();
Response.Write(mp2.EmpId);
Response.Write(mp2.EmpName);
Response.Write(mp2.NoSerialString);
PS:本文章属个人学习总结,部分内容参考互联网上的相关文章。 其中如果发现个人总结有不正确的认知或遗漏的地方请评论告知,欢迎交流。
引文连接:
阅读(...) 评论()

我要回帖

更多关于 serializable序列化 的文章

 

随机推荐