问一下序列化和反序列化的问题,实在是没办法了
我有两个类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 ");
我觉得是 存储过程的 有点问题,声明的变量可能前后引用的不一致导致的, 检查看下
[解决办法]
那么检查一下村进去的,和取出来的结果是一致的吗?
[解决办法]
直接序列化然后反序列化测试一下。
检查一下存进去的和取出来的结果是否一致