首页 > 代码库 > 如何将类序列化并直接存储入数据库
如何将类序列化并直接存储入数据库
参考代码1
可以使用.net提供的序列化和反序列化方法来实现,你可将对象序列化成XML字符串,然后存入数据库中,当你要使用对象的时候,再把数据库中保存字符串反序列化成对象就可以使用了,以下为示例代码:
public class Cat { public string Color { get; set; } public int Speed { get; set; } public string Name{ get; set; } } //序列化 var cat1=new Cat{Color="Write",Speed=50,Name="MiMi" }; XmlSerializer ser = new XmlSerializer(typeof(Cat)); MemoryStream ms = new MemoryStream(); ser.Serialize(ms, cat1); string xmlString = Encoding.UTF8.GetString(ms.ToArray()); //xmlString就是你要保存到数据库的字符串 //反序列化 XmlSerializer dser = new XmlSerializer(typeof(Cat)); //xmlString是你从数据库获取的字符串 Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString)); Cat cat2=dser.Deserialize(xmlStream) as Cat;//cat2 就是你要得到的class对象
参考代码2
创建项目
1. 添加一个名为RWTest的表到 SQL Server MYTest 数据库。 表字段设置如下:
a. 唯一标识字段名称为"ID",类型为Int。
b. 名称为"Description"的VarChar类型的字段,字段长度为50。
c. 名称为"Data" 的varbinary(Max) 类型的字段。
2. 启动 Visual Studio .NET, 并创建一个新的 Visual C# Windows 应用程序项目。
3. 从工具栏中拖两个Button 控件到默认窗体, Form1。
4. 在属性窗口中修改Name为buttonFileToDB, Text 属性为从文件保存到数据库, 然后修改Name为buttonDBToFile ,Text 属性为从数据库保存到文件。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.IO; using System.Collections; using System.Runtime.Serialization.Formatters.Binary; //数据库说明:MyTest数据库,RWTest表,包含3列:ID(int),Description(varchar(50), Data(varbinary(max)) namespace RWArrayListSQL { public partial class Form1 : Form { ArrayList arrayList = new ArrayList(); public Form1() { InitializeComponent(); for (int i = 0; i < 100; i++) { PTData ptData = new PTData(); ptData.PTID = i + 1; ptData.PTName = Convert.ToString(i + 1); ptData.PT_Data = i + 1; arrayList.Add(ptData); } } private void buttonFileToDB_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection("Data Source=liuxueqin;Initial Catalog=MyTest;Integrated Security=True"); SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("Select * from RWTest", sqlConnection); SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter); System.Data.DataSet dataSet = new DataSet("RWTest"); sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;//确定现有 DataSet 架构与传入数据不匹配时需要执行的操作。 //定义一个流 Stream stream = new MemoryStream(); //定义一个格式化器 BinaryFormatter bf = new BinaryFormatter(); foreach (object obj in arrayList) { bf.Serialize(stream, obj); //序列化 } byte[] array = null; array = new byte[stream.Length]; //将二进制流写入数组 stream.Position = 0; stream.Read(array, 0, (int)stream.Length); //关闭流 stream.Close(); try { sqlDataAdapter.Fill(dataSet, "RWTest"); //DataRow表示DataTable中的一行数据 System.Data.DataRow dataRow1; dataRow1 = dataSet.Tables["RWTest"].NewRow(); dataRow1["ID"] = 1; dataRow1["Description"] = "This would be description text"; dataRow1["Data"] = array; dataSet.Tables["RWTest"].Rows.Add(dataRow1); sqlDataAdapter.Update(dataSet, "RWTest"); sqlConnection.Close(); MessageBox.Show("写入数据库成功!", " 信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { if (sqlConnection.State == ConnectionState.Open) { sqlConnection.Close(); } MessageBox.Show("写入数据库失败"+ex.Message, " 信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonDBToFile_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection("Data Source=liuxueqin;Initial Catalog=MyTest;Integrated Security=True"); SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("Select * from RWTest", sqlConnection); SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter); DataSet dataSet = new DataSet("RWTest"); sqlDataAdapter.Fill(dataSet, "RWTest"); DataRow myRow; myRow = dataSet.Tables["RWTest"].Rows[0]; byte[] b = null; b = (byte[])myRow["Data"]; //定义一个流 MemoryStream stream = new MemoryStream(b); //定义一个格式化器 BinaryFormatter bf = new BinaryFormatter(); while (stream.Position != stream.Length) { arrayList.Add(bf.Deserialize(stream)); //反序列化 } stream.Close(); for(int i=0;i<5;i++) //信息提示,是否正确从数据库中取出了ArrayList链表 MessageBox.Show(((PTData)arrayList[i]).PTName, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); if (sqlConnection.State == ConnectionState.Open) { sqlConnection.Close(); } MessageBox.Show(" 从数据库读出数据成功!", " 信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } //在类的上面增加了属性:Serializable.(如果不加这个属性,将抛出SerializationException异常)。在不继承自接口ISerializable的情况下,通过增加[Serializable]属性可以允许该类可以被序列化。 [Serializable] class PTData { public PTData() { PTID = 1; PTName = "None"; PT_Data = 1.0; } public int PTID; public string PTName; public double PT_Data; } }
参考文章
z_y8008, C#如何把一个类的对象存入数据库
Crazy Coder, C#实现将一个类序列化存储在数据库中
如何将类序列化并直接存储入数据库
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。