我有两个类users和member,member是users的子类,我现在对users类进行序列化后存入数据库,但是我进行反序列化的时候抛出的错误是member是null[Serializable]
    public class Users
    {
        public string about;
        public Member member = new Member();
    }
[Serializable]
    public class Member
    {
        public string name;
        public string style;
    }private static void RunAll()//这是把序列化的结果存进数据库
        {
            string str = "hfsjdhfkdsfkdhfsdhfsfsdfsdfsdfsdfsdfdsfdsfdsfdfjsjfsjlajflajsijfaladskfj";
            string name = "艰苦的就";
            string style = "11111111111111122222222222222222进风口大接访大开放";            Users users = new Users();
            users.about = str;
            users.member.name = name;
            users.member.style = style;            BinaryFormatter f = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            f.Serialize(stream, users);
            byte[] writeIn = new byte[stream.Length];
            stream.Read(writeIn, 0, (int)stream.Length);            string strConn = ConfigurationSettings.AppSettings["ConnectionString"].ToString();
            SqlCommand sqlCommand = new SqlCommand("testser", new SqlConnection(strConn));
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.Add(new SqlParameter("@about", SqlDbType.Image));            sqlCommand.Parameters["@about"].Value = writeIn;
            sqlCommand.Connection.Open();
            sqlCommand.ExecuteNonQuery();
            sqlCommand.Connection.Close();
            sqlCommand.Connection.Dispose();
            Console.WriteLine("end");
        }private static void Run()//这是反序列化的结果
        {
            string strConn = ConfigurationSettings.AppSettings["ConnectionString"].ToString();
            SqlCommand sqlCommand = new SqlCommand(string.Format("select top 1 about from fushengtest"), new SqlConnection(strConn));
            sqlCommand.Connection.Open();            byte[] tmp = (byte[])sqlCommand.ExecuteScalar();            sqlCommand.Connection.Close();
            sqlCommand.Connection.Dispose();
            Console.WriteLine(".....................");
            BinaryFormatter f = new BinaryFormatter();
            MemoryStream desStream = new MemoryStream();
            desStream.Write(tmp,0,tmp.Length);
            desStream.Position = 0;
          
            Users s1 = (Users)f.Deserialize(desStream);
            
            desStream.Close();            Console.WriteLine(s1.about);
            Console.WriteLine(s1.member.name);
            Console.WriteLine(s1.member.style);
            Console.WriteLine("end");
        }
请高手指教指教

解决方案 »

  1.   

    [Serializable]
        public class Users
        {
            public string about;
            public Member member = new Member();//应该是个集合吧
        }
      

  2.   

    不是,users.about是正确的
      

  3.   

    哪一行出的错,还有,MemoryStream不是有现成的ToArray方法和MemmoryStream( byte[] )的构造函数么?写得那么复杂干吗?先不要存到数据库,直接序列化然后反序列化测试一下。
      

  4.   

    数据库的字段类型是image,以二进制的形式存的数据,难道这里有问题?
      

  5.   

    不知道那个构造函数是否有问题,试一下这样改不知道可否。
       public class Users
        {
            public string about;
            public Member member;//在这里new可能会有影响,它会在构造函数执行前就出发这个动作
            public Users()
            {
              member = new Member();
            }
        }
      

  6.   

    先对子类的说法汗一下 :)既然存本地文件没有问题,说明序列化时已经将Users成员对象member与Users的关联关系考虑进去了,而在数据库持久化和反持久化时出错,可能是关联关系出问题。
      

  7.   

    public object DeSerializeBinary(byte[] content) 
    {
    if(content.Length==0)
    return null;
    try
    {
    BinaryFormatter binaryFormatter=new BinaryFormatter();
    MemoryStream ms=new MemoryStream();
    ms.Write(content,0,content.Length);
    ms.Position=0;
    return (object)binaryFormatter.Deserialize(ms);
    }
    catch(Exception ex)
    {
    ex.ToString();
    }
    return null; }
    public byte[] SerializeBinary(object obj) 
    {
    if(obj==null)
    return null;
    try
    {
    BinaryFormatter biaryFormatter=new BinaryFormatter();
    MemoryStream ms=new MemoryStream();
    biaryFormatter.Serialize(ms,obj);
    ms.Position=0;
    byte[] content=new Byte[ms.Length];
    ms.Read(content,0,content.Length);
    ms.Close();
    return content;
    }
    catch{}
    return null;
    }
      

  8.   

    string strConn = ConfigurationSettings.AppSettings["ConnectionString"].ToString();
                SqlCommand sqlCommand = new SqlCommand("testser", new SqlConnection(strConn));
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.Add(new SqlParameter("@about", SqlDbType.Image));//??            sqlCommand.Parameters["@about"].Value = writeIn;
                sqlCommand.Connection.Open();
                sqlCommand.ExecuteNonQuery();
                sqlCommand.Connection.Close();
                sqlCommand.Connection.Dispose();
                Console.WriteLine("end");我觉得是 存储过程的 有点问题,声明的变量可能前后引用的不一致导致的, 检查看下
      

  9.   

    这是我的一个测试程序,数据库设计也很简单,就是一个字段about,数据类型是image
      

  10.   

    问题解决了,把 stream.Read(writeIn, 0, (int)stream.Length);
    改成 writeIn = stream.GetBuffer();原因是stream.Length的类型是long,转换成int后,丢失了数据