Преобразование ArrayList of Points в байтовый массив для хранения в базе данных SQL - PullRequest
3 голосов
/ 23 ноября 2010

У меня есть часть приложения, которое используется для сохранения подписи пользователя на портативном устройстве.Мне удалось сделать это с помощью массива «Линии», который содержит массив «точек».Мне нужно хранить эту информацию в базе данных SQL.Единственная информация, которую я видел, чтобы сделать это, это использовать тип данных изображения и передать ему байтовый массив.Есть вопрос.Как мне это сделать, или есть лучший способ?

Ответы [ 4 ]

2 голосов
/ 23 ноября 2010

Если вы преобразуете эти данные в изображение, некоторая информация (какая точка принадлежит какой линии) будет потеряна.Если вы хотите сохранить эту информацию, вам следует сериализовать ваши данные.

Определиться с форматом : вы можете использовать что-то ужасно многословное, например 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) формат, ваша сериализация даст строку, которую вы можете сохранить в поле varchar(MAX) или text в SQL Server.Если вы выберете двоичную кодировку, сериализация приведет к массиву байтов.Для этого varbinary(MAX) или image является выбранным типом данных.Обратите внимание, что имя image может вводить в заблуждение: не обязательно означает, что ваши данные закодированы как «изображение» (jpeg, png и т.Реализация : для XML и стандартной двоичной кодировки .NET предоставляет встроенные функции.Вот введение и ссылки на пошаговые руководства по MSDN:

Если вы решите использовать пользовательский текстовый интерфейсили пользовательское двоичное кодирование, вам нужно будет самостоятельно кодировать части сериализации и десериализации.Если вам нужна помощь в этом, вам нужно предоставить дополнительную информацию: Как точно выглядит ваша структура данных?Какие типы данных являются вашими координатами X и Y?

2 голосов
/ 23 ноября 2010

Звучит так, будто вы хотите какую-то форму двоичной сериализации; Вот рабочая версия с использованием 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 голос
/ 23 ноября 2010

То есть вы позволяете пользователю создавать растровое изображение, подписывая стилусом?Звучит вполне разумно для меня, чтобы сохранить это как изображение.

создать растровое изображение из массива

0 голосов
/ 23 ноября 2010

Просто создайте черно-белое растровое изображение из ваших данных, а затем преобразуйте его в PNG-изображение с помощью библиотеки .NET:

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

И сохраните его как двоичные данные. Большинство баз данных имеют формат для хранения двоичных данных: PostgreSQL Bytea, MySQL и Oracle blob, образ MSSQL и т. Д.

...