代码之家  ›  专栏  ›  技术社区  ›  Kelsey

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

  •  1
  • Kelsey  · 技术社区  · 15 年前

    我的目标如下:

    [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();
    }
    

    然后,我将这个序列化字符串传递给 SQL2000 作为 NTEXT 然后将其插入数据库:

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

    我遇到的问题是图像被破坏了。这个 btye[] SerializeObjectToXmlString 函数解决了问题,但它不处理 byte[] 正确地说,也许是 OpenXML SQL函数,甚至是我将XML作为 内文 帕拉姆。我希望serialize函数能够正确地编码二进制文件,但我可能错了。

    编辑: 字节[] 转换为base64字符串,然后作为base64传递给存储的进程。然后,我将这个base64字符串保存到SQL中的图像字段中,并将其作为 b字节[] . 所以我想我需要设法把它从base64升级到a 字节[] 在把它放进我的桌子之前?

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

    3 回复  |  直到 15 年前
        1
  •  2
  •   Matt    15 年前

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

        2
  •  2
  •   Thomas Levesque    15 年前

    正如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序列化没有意义)

        3
  •  0
  •   Gaidin    15 年前