以二进制方式存储对象到数据库
2009-11-20 13:31
495 查看
=================================================
本文为khler原作,转载必须确保本文完整并完整保留原作者信息及本文原始链接
E-mail: khler@163.com
QQ: 23381103
MSN: pragmac@hotmail.com
=================================================
C#开发中,往往将一个对象的所有属性映射为数据库中的一张表,每个属性对应表里面的每个字段,这个对象的属性大部分是string、int、double等基础类型,当然也有很多是复杂类型对象,我们往往会将这个复杂类对象的所有属性映射为另一张表进行存储。有时候为了简单起见,我们可以把这个复杂类对象的属性映射为表里面的二进制字段进行存储,避免了新建表及关连查询的一大堆繁琐事务。
具体实现如下:
有一个类Person:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
namespace TestBinaryObjectSerializedIntoDatabase
{
public class Person
{
private Guid id = Guid.NewGuid();
private string name;
private double height;
private Pet pet;
/// <summary>
/// Id
/// </summary>
public Guid Id
{
get { return id; }
set { id = value; }
}
/// <summary>
/// 名字
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
/// <summary>
/// 身高
/// </summary>
public double Height
{
get { return height; }
set { height = value; }
}
/// <summary>
/// 宠物
/// </summary>
public Pet MyPet
{
get { return pet; }
set { pet = value; }
}
}
}
其中宠物MyPet属性就是一个复杂类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace TestBinaryObjectSerializedIntoDatabase
{
[Serializable()]
public class Pet
{
private Guid id = Guid.NewGuid();
private string name;
private double weight;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="id"></param>
public Pet(Guid id, string name)
{
this.id = id;
this.name = name;
}
/// <summary>
/// Id
/// </summary>
public Guid Id
{
get { return id; }
}
/// <summary>
/// 名字
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
/// <summary>
/// 体重
/// </summary>
public double Weight
{
get { return weight; }
set { weight = value; }
}
}
}
为了简单说明存储机制,我做了一个例子(从这里下载示例代码),通过DataSet将数据保存到数据库中,并且系列化成了一个xml文件。要打开此示例,你必须具有VS2008或以上版本,要运行此示例,你必须安装.net3.5。
示例中,我将对象以二进制方式存到了Person表中的Pet字段:
// 本例关键:从数据库中读取二进制数据并转换为对象
MemoryStream stream = new MemoryStream((byte[])dr["Pet"]);
IFormatter formatter = new BinaryFormatter();
pet = (Pet)formatter.Deserialize(stream);
读取时:
// 本例关键:将对象系列化为二进制流并保存到数据库
MemoryStream stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, pet);
dr["Pet"] = stream.GetBuffer();
本文中的示例也同时实现了数据的xml存储机制,对于小型项目,可以通过DataSet管理数据库并存储为xml文件,简单、方便、快捷、小巧,非常实用。
本文为khler原作,转载必须确保本文完整并完整保留原作者信息及本文原始链接
E-mail: khler@163.com
QQ: 23381103
MSN: pragmac@hotmail.com
=================================================
C#开发中,往往将一个对象的所有属性映射为数据库中的一张表,每个属性对应表里面的每个字段,这个对象的属性大部分是string、int、double等基础类型,当然也有很多是复杂类型对象,我们往往会将这个复杂类对象的所有属性映射为另一张表进行存储。有时候为了简单起见,我们可以把这个复杂类对象的属性映射为表里面的二进制字段进行存储,避免了新建表及关连查询的一大堆繁琐事务。
具体实现如下:
有一个类Person:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
namespace TestBinaryObjectSerializedIntoDatabase
{
public class Person
{
private Guid id = Guid.NewGuid();
private string name;
private double height;
private Pet pet;
/// <summary>
/// Id
/// </summary>
public Guid Id
{
get { return id; }
set { id = value; }
}
/// <summary>
/// 名字
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
/// <summary>
/// 身高
/// </summary>
public double Height
{
get { return height; }
set { height = value; }
}
/// <summary>
/// 宠物
/// </summary>
public Pet MyPet
{
get { return pet; }
set { pet = value; }
}
}
}
其中宠物MyPet属性就是一个复杂类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace TestBinaryObjectSerializedIntoDatabase
{
[Serializable()]
public class Pet
{
private Guid id = Guid.NewGuid();
private string name;
private double weight;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="id"></param>
public Pet(Guid id, string name)
{
this.id = id;
this.name = name;
}
/// <summary>
/// Id
/// </summary>
public Guid Id
{
get { return id; }
}
/// <summary>
/// 名字
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
/// <summary>
/// 体重
/// </summary>
public double Weight
{
get { return weight; }
set { weight = value; }
}
}
}
为了简单说明存储机制,我做了一个例子(从这里下载示例代码),通过DataSet将数据保存到数据库中,并且系列化成了一个xml文件。要打开此示例,你必须具有VS2008或以上版本,要运行此示例,你必须安装.net3.5。
示例中,我将对象以二进制方式存到了Person表中的Pet字段:
// 本例关键:从数据库中读取二进制数据并转换为对象
MemoryStream stream = new MemoryStream((byte[])dr["Pet"]);
IFormatter formatter = new BinaryFormatter();
pet = (Pet)formatter.Deserialize(stream);
读取时:
// 本例关键:将对象系列化为二进制流并保存到数据库
MemoryStream stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, pet);
dr["Pet"] = stream.GetBuffer();
本文中的示例也同时实现了数据的xml存储机制,对于小型项目,可以通过DataSet管理数据库并存储为xml文件,简单、方便、快捷、小巧,非常实用。
相关文章推荐
- SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。
- 二进制方式存储图片(数据库)
- 如何显示数据库中以 OLE 对象方式存储的 JPEG 图片
- 关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心
- 关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心得
- 如何显示数据库中以 OLE 对象方式存储的 JPEG 图片
- 数据持久化3种方式:属性列表、对象归档、数据库存储
- 关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心得
- 用VC,VB进行图像数据(二进制大对象)存储数据库的方法
- SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。
- java io 二进制方式存储对象到文件
- Oracle数据库对于大对象二进制文件的存储及下载
- C++类的成员函数存储方式(是否属于类的对象)
- 将图片(二进制文件)存储于数据库,论文件字节流与二进制字符串相互转换
- java使用url和tns两种方式连接数据库执行存储过程
- 在数据库中 存储图片 以及 在界面中显示图片(存储图片路径)- 这种方法相对与存储二进制文件好
- float浮点数的二进制存储方式及转换
- ADO.NET 更新数据库的2种方式::(1)使用DataSet对象更新数据集;(2)使用SqlCommand对象更新单条记录
- 【慕课笔记】4-5 应用DOM4J及JDOM方式解析XML—在JDOM中存储Book对象
- H5本地存储-indexedDB数据库(二)创建对象仓库