3

我正在使用用 C# ( SourceAFIS )编写的开源指纹识别程序,它将注册用户存储在 .dat 文件中。

要从 .dat 文件中读取,我使用:

List<MyPerson> database = new List<MyPerson>();
BinaryFormatter formatter = new BinaryFormatter();

if (File.Exists(Database))
{ 
    using (FileStream stream = System.IO.File.OpenRead(Database)) 
    database = (List<MyPerson>)formatter.Deserialize(stream); 
}

Databasedatabase.dat 文件的路径在哪里。

有了这个,我可以用来database.Add(Enroll(Image, Name));将人们注册到系统中。

注册函数如下:

static MyPerson Enroll(string filename, string name)
{
    MyFingerprint fp = new MyFingerprint();
    fp.Filename = filename;
    BitmapImage image = new BitmapImage(new Uri(filename, UriKind.RelativeOrAbsolute));
    fp.AsBitmapSource = image;
    MyPerson person = new MyPerson();
    person.Name = name;
    person.Fingerprints.Add(fp);
    person.Fingerprints[0].Finger = Finger.LeftThumb;
    Afis.Extract(person);
    return person;
}

我想知道是否可以列出数据库中的每个用户并将它们显示在我的 ASP.NET MVC 视图之一中?如何检查数据库的写入方式?

编辑:

在控制器中声明的 MyPerson 和 MyFingerprint 类

[Serializable]
class MyPerson : Person
{ public string Name; }

[Serializable]
class MyFingerprint : Fingerprint
{ public string Filename; }
4

2 回答 2

1

您示例中的database对象不是传统意义上的数据库。相反,它是序列化为文件List的对象,包括它们的指纹模板和类包含的任何其他值。有一个文档描述了用于写入文件的格式,但由于该文件仅表示 type 的对象,因此尝试读取文件的二进制格式并没有太多好处。我已经多次使用序列化,并且从未费心查看文件格式。让班级处理工作要安全得多。MyPersonMyPersonList<MyPerson>BinaryFormatter

如果您还没有,您应该查看MSDN上的序列化文档。如果你的MyPerson类在未来有任何改变的机会,你应该查看版本容忍序列化部分以避免潜在的问题。

database对象可以直接传递给视图,如以下示例代码所示。您可能需要更新视图中的命名空间以反映您的项目。该Index方法中的代码只是为了演示这个概念:它并不反映良好的应用程序架构。

控制器

public class MyPersonController : Controller {

    public ActionResult Index() {
        List<MyPerson> database = new List<MyPerson>();
        BinaryFormatter formatter = new BinaryFormatter();
        if (File.Exists(Database))
        { 
            using (FileStream stream = System.IO.File.OpenRead(Database)) 
            database = (List<MyPerson>)formatter.Deserialize(stream); 
        }


        return View(database);
    }
}

查看,仅列出该Name属性

@model IEnumerable<MyPerson>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
    </tr>
}

</table>
于 2013-05-07T04:24:08.073 回答
0

您已使用 SourceAFIS 中的示例项目作为您的基础。您最好使用真实的数据库来存储人和图像的信息。与基于文件的存储相比,这具有太多优势。

  • 允许多个客户端
  • 修复并发问题
  • 提供网络访问
  • 提供简单的分页
  • 不需要文件系统访问

您甚至可以使用 SQL Server Express 版本开始。

现在,回答你的问题

  1. 是的,您可以在 MVC 页面上列出您的用户,并并排显示他们的图片。
  2. 您不需要检查您的用户已写入的“数据库”,因为所有用户都存储在同一个数据库中,您可以使用鉴别器字段来过滤您想要的用户。

你已经注意到你的知识是有限的。你应该开始通过研究和阅读来扩展你的知识。您可能会开始阅读有关 Entity Framework 或 Linq 2 Sql 的内容。

创建数据库并将 dat 文件加载到该数据库后,代码将如下所示(使用 Linq2Sql)。

public class MyPersonController : Controller {

    public ActionResult Index() {
        var people = PersonStore.GetAllPeople();

        return View(people);
    }

    public ActionResult Image(int id) {
        var image = PersonStore.GetPersonImageById(id);

        return BinaryResult(image.Content, image.MimeType);
    }
}

和你的看法

@model IEnumerable<PersonModel>
<table>
    @foreach (var Person in Model)
    {
        <td>@person.Name</td>
        <td><img src="@Url.Action("Image", new { id = person.id })"></td>
    }
</table>
于 2013-05-07T13:32:49.467 回答