各位老师 :
值此元旦佳节之际 , 来信首先祝各位老师元旦快乐 , 新年吉祥 !在某个程序集文件里面 , 以学生对象为例 , 介绍了简单对象的序列化和反序列化 , 相关代码如下 :
(一)序列化 :
[Serializable]
class CollegeStudent
{
public String Name = “空” ; //姓名
public bool IsMale = true ; //性别
public int ScoreForEnterExamination = 0 ; //入学考试成绩
}Using ( FileStream writer = new FileStream(FileName , FileMode.Create))
{
IFormatter formatter = new BinaryFormatter( ) ; //创建格式化对象
Formatter.Serialize(writer , stu) ; //格式化对象序列化对象
}(二)反序列化 :
private CollegeStudent DeserializeObj(String FileName)
{
Using (FileStream reader = new FileStream(FileName , FileMode.Open))
{
IFormatter formatter = new BinaryFormatter( ) ;
Return ( CollegeStudent )formatter.Deserialize(reader) ;
}
}
以上代码 , 如果是在一个程序集文件(.Exe文件或.Dll文件) , 序列化和反序列化不会有任何问题 。 反序列化之所以不会有问题 , 是因为formatter.Deserialize(reader) 方法返回的对象 , 可以强制转换成CollegeStudent 对象 。
也就是说 , Return ( CollegeStudent )formatter.Deserialize(reader) 这一条语句能成功通过编译 , 不会有什么编译错误 。
但我现在希望 , 在一个程序集文件(.Exe文件)里面将对象序列化到某个配置文件 , 而在另一个程序集文件(.Exe文件)通过前面的配置文件对对象进行反序列化 , 就好象序列化和反序列化是在异地远程进行处理一样 , 结果却没能成功 。
我用到了反射技术 `, 但由于第二个程序集(.Exe文件) 里面没有CollegeStudent 对象 , 相关的反射方法(例如System.. Activator . CreateInstance , System . Type . InvokeMember , System . Reflection . ConstructorInfo 的 Invoke 实例方法 , 等等) , 都无法直接返回 CollegeStudent 对象 。 因为它们的调用形式都如下所示 :
Objcet obj = System . Activator . CreateInstance ) ;
Objcet obj = SomeType . InvokeMember( ) ;
Objcet obj = SomeConstructorInfo . Invoke( ) ; 也就是说 , 返回的都是Object 类型的对象 。 正是因为缺乏CollegeStudent类型 , 所以 Return ( CollegeStudent )formatter.Deserialize(reader) 在第二个程序集文件 , 不能正确地进行编译 。 也正是因为不能对上面的语句进行编译 , 所以在第二个程序集文件(.EXE文件)里面 , 不能对学生对象进行反序列化 。 以上问题 , 不知道该如何解决 , 还望各位老师多多指教 !
值此元旦佳节之际 , 来信首先祝各位老师元旦快乐 , 新年吉祥 !在某个程序集文件里面 , 以学生对象为例 , 介绍了简单对象的序列化和反序列化 , 相关代码如下 :
(一)序列化 :
[Serializable]
class CollegeStudent
{
public String Name = “空” ; //姓名
public bool IsMale = true ; //性别
public int ScoreForEnterExamination = 0 ; //入学考试成绩
}Using ( FileStream writer = new FileStream(FileName , FileMode.Create))
{
IFormatter formatter = new BinaryFormatter( ) ; //创建格式化对象
Formatter.Serialize(writer , stu) ; //格式化对象序列化对象
}(二)反序列化 :
private CollegeStudent DeserializeObj(String FileName)
{
Using (FileStream reader = new FileStream(FileName , FileMode.Open))
{
IFormatter formatter = new BinaryFormatter( ) ;
Return ( CollegeStudent )formatter.Deserialize(reader) ;
}
}
以上代码 , 如果是在一个程序集文件(.Exe文件或.Dll文件) , 序列化和反序列化不会有任何问题 。 反序列化之所以不会有问题 , 是因为formatter.Deserialize(reader) 方法返回的对象 , 可以强制转换成CollegeStudent 对象 。
也就是说 , Return ( CollegeStudent )formatter.Deserialize(reader) 这一条语句能成功通过编译 , 不会有什么编译错误 。
但我现在希望 , 在一个程序集文件(.Exe文件)里面将对象序列化到某个配置文件 , 而在另一个程序集文件(.Exe文件)通过前面的配置文件对对象进行反序列化 , 就好象序列化和反序列化是在异地远程进行处理一样 , 结果却没能成功 。
我用到了反射技术 `, 但由于第二个程序集(.Exe文件) 里面没有CollegeStudent 对象 , 相关的反射方法(例如System.. Activator . CreateInstance , System . Type . InvokeMember , System . Reflection . ConstructorInfo 的 Invoke 实例方法 , 等等) , 都无法直接返回 CollegeStudent 对象 。 因为它们的调用形式都如下所示 :
Objcet obj = System . Activator . CreateInstance ) ;
Objcet obj = SomeType . InvokeMember( ) ;
Objcet obj = SomeConstructorInfo . Invoke( ) ; 也就是说 , 返回的都是Object 类型的对象 。 正是因为缺乏CollegeStudent类型 , 所以 Return ( CollegeStudent )formatter.Deserialize(reader) 在第二个程序集文件 , 不能正确地进行编译 。 也正是因为不能对上面的语句进行编译 , 所以在第二个程序集文件(.EXE文件)里面 , 不能对学生对象进行反序列化 。 以上问题 , 不知道该如何解决 , 还望各位老师多多指教 !
解决方案 »
- C# tabcontorl
- 请问如何实现记录的上下移动?
- 我有个客户,他要给他的所有客户发送短消息怎样实现呢?需要什么样的硬件环境和软件环境呢,谢谢
- 收来自Exchange server 服务器的邮件用什么协议啊?
- webbrowser查看asp.net webform页面进行dopostback跳转,怎么知道加载完成?
- openFileDialog控件的用法
- 巨难:用程序算法如果区别两图片的相似百分比(是否是同一张图片)
- c#数据库编程都用什么呀,不用dataset可以吗?
- dos下的问题
- 方法返回值的类型都有哪些?谢谢
- C#如何实现文件头部添加标记
- ProcessCmdKey的问题 欢迎高手来解答哈~
如
A.A aa = new A.A();
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, aa);ms.Seek(0, SeekOrigin.Begin);
bf.Binder = new MyBinder();
B.A ba = (B.A)bf.Deserialize(ms);
class MyBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
return typeof(B.A);
}
}