将Points的ArrayList转换为字节数组以存储在SQL数据库中

时间:2010-11-23 09:37:48

标签: c# sql image arraylist bytearray

我有一个应用程序的一部分,用于在手持设备上保存用户签名。 我设法通过一个包含一个“点”的arraylist的“Lines”的arraylist来做到这一点。 我需要将此信息存储在SQL数据库中。我见过的唯一信息就是使用图像数据类型并传递一个字节数组。有问题。我该怎么做,还是有更好的方法?

4 个答案:

答案 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)

所以你让用户通过手写笔签名来创建位图图形? 对于我来说,将它存储为图像听起来非常合理。

create bitmap from array

答案 3 :(得分:0)

只需从数据中创建黑白位图,然后使用.NET库将位图转换为PNG图像:

MemoryStream pngbuffer = new MemoryStream();
Bitmap.Save(pngbuffer,ImageFormat.Png)

并将其存储为二进制数据。大多数数据库都有一种存储二进制数据的格式:PostgreSQL bytea,MySQL和Oracle blob,MSSQL图像等。