黑马程序员技术交流社区

标题: 关于反序列化 [打印本页]

作者: 陈顺亮    时间: 2012-10-6 19:11
标题: 关于反序列化
本帖最后由 陈顺亮 于 2012-10-6 22:10 编辑

从别人电脑传过来一个序列化的文本文件,如何对其进行反序列化,来个具体实例看看把
作者: 和志强    时间: 2012-10-6 21:39
是不是在反序列化的时候出现:
无法找到程序集“XXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”。这个异常那
如果是这个异常请咨询您的好基友,他序列化时所用的程序集的命名空间名,类名,字段,属性,字段类型,然后写一个和好基友上述内容一样的命名空间名,类名,等等,再反序列化,即可
作者: 神马王刚    时间: 2012-10-6 21:40
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace Lesson2
  6. {
  7. [Serializable]
  8. public class Person
  9. {
  10. // 让用户输入姓名 年龄 性别 住址 邮箱 血型 职业 毕业学校
  11. private string _name;

  12. public string Name
  13. {
  14. get { return _name; }
  15. set { _name = value; }
  16. }
  17. private string _gender;

  18. public string Gender
  19. {
  20. get { return _gender; }
  21. set { _gender = value; }
  22. }
  23. private int _age;

  24. public int Age
  25. {
  26. get { return _age; }
  27. set { _age = value; }
  28. }
  29. private string _adress;

  30. public string Adress
  31. {
  32. get { return _adress; }
  33. set { _adress = value; }
  34. }
  35. private string _email;

  36. public string Email
  37. {
  38. get { return _email; }
  39. set { _email = value; }
  40. }
  41. private string _typeofblood;

  42. public string Typeofblood
  43. {
  44. get { return _typeofblood; }
  45. set { _typeofblood = value; }
  46. }
  47. private string _job;

  48. public string Job
  49. {
  50. get { return _job; }
  51. set { _job = value; }
  52. }
  53. private string _graduateSchool;

  54. public string GraduateSchool
  55. {
  56. get { return _graduateSchool; }
  57. set { _graduateSchool = value; }
  58. }
  59. }
  60. }
  61. 以上为Person类

  62. string path = @"D:\DiduTimes\CsharpSelfDoc\20121006\456.txt";//读取别人序列化后的记事本文档
  63. //比如456记事本中存的是"              >Lesson2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   Lesson2.Person   _name_gender_age_adress_email _typeofblood_job_graduateSchool        绐﹀Ξ濠?   濂?      鍖椾含   douniwan@itcast.cn   o   瀛︾敓    鍖楀ぇ ";可以将引号里的内容粘贴到记事本文档中并命名为456.txt
  64.             using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))//可读
  65.             {
  66.                 BinaryFormatter bf = new BinaryFormatter();
  67.                 p = (Person)bf.Deserialize(fs);//反序列化,用里氏转换为Person类
  68.             }
  69.             Console.WriteLine(p.Name);
  70.             Console.WriteLine(p.Age);
  71.             Console.WriteLine(p.Gender);
  72.             Console.WriteLine(p.Typeofblood);
  73.             Console.WriteLine(p.Adress);
  74.             Console.WriteLine(p.Email);
  75.             Console.WriteLine(p.Job);
  76.             Console.WriteLine(p.GraduateSchool);//输出实例化对象的信息
  77.             Console.ReadKey();

  78. 序列化时,可写状态,bf.Serialize(fs, p);序列化时,参数除了要实例化后的文件流,还要输入实例化的对象名
  79. 反序列化时,可读状态,p = (Person)bf.Deserialize(fs);反序列化,只需要实例化后的文件流,但是需要里氏转换类型,然后用实例化的对象名来接收,通过对象.属性输出显示所存储的值.
复制代码

作者: 邓艳秋    时间: 2012-10-6 21:52
类名,属性,字段都要一样。
再用
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Write))
            {
                BinaryFormatter bf = new BinaryFormatter();
                str = (string[])bf.Deserialize(fs);
            }
            for (int i = 0; i < str.Length; i++)
            {
                Console.WriteLine(str[i]);
            }

就可以达到反序列化的效果了。
作者: 陈顺亮    时间: 2012-10-6 22:10
我还能说什么呢。。。。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2