我有一个应用程序的一部分,用于在手持设备上保存用户签名。 我设法通过一个包含一个“点”的arraylist的“Lines”的arraylist来做到这一点。 我需要将此信息存储在SQL数据库中。我见过的唯一信息就是使用图像数据类型并传递一个字节数组。有问题。我该怎么做,还是有更好的方法?
答案 0 :(得分:2)
听起来你想要某种形式的二进制序列化;这是使用protobuf-net的工作版本(注意我已将ArrayList
更改为List<T>
):
using System.Collections.Generic;
using System.IO;
using ProtoBuf;
[ProtoContract]
class Line
{
private readonly List<Point> points = new List<Point>();
[ProtoMember(1, DataFormat = DataFormat.Group)]
public List<Point> Points { get { return points; } }
}
[ProtoContract]
class Point
{
[ProtoMember(1)]
public int X { get; set; }
[ProtoMember(2)]
public int Y { get; set; }
}
static class Program
{
static void Main()
{
var lines = new List<Line> {
new Line { Points = {
new Point { X = 1, Y = 2}
}},
new Line { Points = {
new Point { X = 3, Y = 4},
new Point { X = 5, Y = 6}
}},
};
byte[] raw;
// serialize
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, lines);
raw = ms.ToArray();
}
List<Line> clone;
// deserialize
using (var ms = new MemoryStream(raw))
{
clone = Serializer.Deserialize<List<Line>>(ms);
}
}
}
答案 1 :(得分:2)
如果将此数据转换为图像,则会丢失某些信息(该点属于哪一行)。如果您想保留此信息,则应序列化您的数据。
决定格式:你可以使用像XML这样非常冗长的东西......
<Line>
<Point X="3" Y="4" />
<Point X="3" Y="5" />
...
</Line>
<Line>
<Point X="10" Y="10" />
...
</Line>
...
...或某些基于文字的自定义格式:
3,4-3,5-...;10,10-...;...
当然,您可以最有效地以某种二进制编码方式存储数据。
如果使用基于文本(或XML)的格式,则序列化将生成一个字符串,您可以将其存储在SQL Server的varchar(MAX)
或text
字段中。如果您决定使用二进制编码,序列化将产生一个字节数组。为此,varbinary(MAX)
或image
是所选的数据类型。请注意,名称image
可能会产生误导:不必然意味着您的数据被编码为“图像”(jpeg,png等)。
实现:对于XML和标准二进制编码,.NET提供了内置函数。以下是MSDN上演练的介绍和链接:
如果您决定使用某些基于文本的自定义或自定义二进制编码,则需要自己编写序列化和反序列化部分的代码。如果您需要帮助,您需要提供更多信息:您的数据结构如何准确?您的X和Y坐标是什么数据类型?
答案 2 :(得分:1)
所以你让用户通过手写笔签名来创建位图图形? 对于我来说,将它存储为图像听起来非常合理。
答案 3 :(得分:0)
只需从数据中创建黑白位图,然后使用.NET库将位图转换为PNG图像:
MemoryStream pngbuffer = new MemoryStream();
Bitmap.Save(pngbuffer,ImageFormat.Png)
并将其存储为二进制数据。大多数数据库都有一种存储二进制数据的格式:PostgreSQL bytea,MySQL和Oracle blob,MSSQL图像等。