首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

问一下序列化和反序列化的有关问题,实在是没办法了

2012-01-19 
问一下序列化和反序列化的问题,实在是没办法了我有两个类users和member,member是users的子类,我现在对user

问一下序列化和反序列化的问题,实在是没办法了
我有两个类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 ");
                }
请高手指教指教

[解决办法]
[Serializable]
public class Users


{
public string about;
public Member member = new Member();//应该是个集合吧
}
[解决办法]
哪一行出的错,还有,MemoryStream不是有现成的ToArray方法和MemmoryStream( byte[] )的构造函数么?写得那么复杂干吗?

先不要存到数据库,直接序列化然后反序列化测试一下。
[解决办法]
不知道那个构造函数是否有问题,试一下这样改不知道可否。
public class Users
{
public string about;
public Member member;//在这里new可能会有影响,它会在构造函数执行前就出发这个动作
public Users()
{
member = new Member();
}
}
[解决办法]
先对子类的说法汗一下 :)

既然存本地文件没有问题,说明序列化时已经将Users成员对象member与Users的关联关系考虑进去了,而在数据库持久化和反持久化时出错,可能是关联关系出问题。
[解决办法]
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;
}

[解决办法]
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 ");

我觉得是 存储过程的 有点问题,声明的变量可能前后引用的不一致导致的, 检查看下
[解决办法]
那么检查一下村进去的,和取出来的结果是一致的吗?

[解决办法]
直接序列化然后反序列化测试一下。
检查一下存进去的和取出来的结果是否一致

热点排行