我想使用DB4o存储照片,并尝试使用以下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Db4objects.Db4o;
using Db4objects.Db4o.Linq;
namespace imagemsDb4o
{
class Person
public class Person
{
public string Name { set; get; }
public byte foto { set; get; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click_1(object sender, EventArgs e)
{
FileInfo fi = new FileInfo("c:\\test.yap");
if (fi.Exists)
fi.Delete();
pictureBox1.Load("c:\\sunset.jpg");
Person pers = new Person();
pers.Name = "Martin";
pers.bild = (System.Drawing.Bitmap)(pictureBox1.Image);
IObjectContainer db = Db4oFactory.OpenFile("c:\\test.yap");
db.Store(pers);
db.Commit();
db.Close();
}
private void button2_Click_1(object sender, EventArgs e)
{
Person suchpers = new Person();
suchpers.Name = "Martin";
IObjectContainer db = Db4oFactory.OpenFile("c:\\test.yap");
IObjectSet result = db.QueryByExample(suchpers);
Person gefunden = (Person)result.Next();
textBox2.Text = (string) gefunden.Name;
pictureBox2.Image = (byte) gefunden.bild;
db.Close();
}
}
}
单击button2时出现错误。 我必须做出什么改变?
答案 0 :(得分:3)
您正在尝试从WindowForms / WPF(System.Drawing.Bitmap-Object)存储GUI- / Drawing-Object。但是这不起作用。原因是GUI类(Winforms,WPF等)通常包含对底层绘图系统的引用,就像OS资源的本机句柄一样。那些无法正确序列化。在这种情况下,您创建了一个代表Image的类。该类包含图片的表示。通常这是一个存储图像的Blob。
有two basic ways来处理Blob。您可以将blob作为字节数组存储在数据库中,也可以使用特殊的db4o-Blob-Type。两者都有其优点。
字节数组的优点/缺点:
db4o-blobs的优点/不足
对于你的情况,我会在Person类中存储一个带有图片的byte []数组。或者您创建一个特殊的Image类。这个图像类包含一个带图片的字节数组。以及一些将此字节数组转换为Winforms-bitmap的方法。
答案 1 :(得分:1)
我认为你应该在分配到foto属性之前将图片转换为字节数组,并在分配到picturebox的image属性之前将字节数组转换回位图