使用要保存到SQL数据库的映像序列化对象

时间:2009-08-12 16:40:56

标签: c# xml serialization sql-server-2000 binary-data

我有以下对象:

[Serializable]
public class ExampleImage
{
    public int ID { get; set; }
    public string Filename { get; set; }
    public byte[] Content { get; set; }
}

我将其存储在List<ExampleImage>中,然后传递给以下函数将其序列化为字符串:

static string SerializeObjectToXmlString(object o)
{
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(o.GetType());
    System.IO.StringWriter writer = new System.IO.StringWriter();
    serializer.Serialize(writer, o);
    return writer.ToString();
}

然后我将此序列化字符串作为NTEXT传递给 SQL2000 中的存储过程,然后将其处理以将其插入数据库中:

SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')

我遇到的问题是图像被破坏了。 btye[]未正确保存到数据库。其他领域都很好。这是我第一次尝试通过XML将二进制数据发送到SQL,所以我很可能在这一点上做错了。我的SerializeObjectToXmlString函数是否正常运行,并且它没有正确处理byte[]的序列化,可能是OpenXML SQL函数,甚至是我正在以{{{{}发送XML的事实1}} param。我希望序列化函数能够正确编码二进制文件,但我可能错了。

任何想法是什么问题,或者更好的方法一次性保存一堆图像?

编辑:我认为正在发生的事情是,序列化程序正在将NTEXT转换为base64字符串,然后将其作为base64传递给存储过程。然后我将这个base64字符串保存到SQL中的Image字段中,并将其作为byte[]读出。所以我想我需要以某种方式从base64到btye[]才能将它插入我的表中?

编辑:我开始认为我唯一的选择是将存储过程更改为一次只执行1个图像而不使用XML,只需将byte[]作为byte[]键入并包装事务中的所有调用。

3 个答案:

答案 0 :(得分:2)

不是将其序列化为XML,而是将其序列化为byte []并将其存储在数据库中的varbinary(MAX)类型字段中。

答案 1 :(得分:2)

正如Gaidin所说,base64是最佳选择。这是将二进制数据写入XML的常用方法。您可以使用以下代码:

public class ExampleImage
{
    public int ID { get; set; }
    public string Filename { get; set; }

    [XmlIgnore]
    public byte[] Content { get; set; }

    [XmlElement("Content")]
    public string ContentBase64
    {
        get { return Convert.ToBase64String(Content); }
        set { Content = Convert.FromBase64String(value); }
    }
}

(顺便说一句,Serializable属性对XML序列化没有意义)

答案 2 :(得分:0)

您可以尝试将其转换为base64,然后将其保存到TEXT字段或其他内容。