序列化对象与图象被保存到SQL数据库
-
13-09-2019 - |
题
我有以下目的:
[Serializable]
public class ExampleImage
{
public int ID { get; set; }
public string Filename { get; set; }
public byte[] Content { get; set; }
}
我的商店在这 List<ExampleImage>
然后我通过以下功能serialize到一串:
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[]
是没有得到正确保存的数据库。其他领域的就好了。这是我第一次尝试发送的二进制数据通过XML SQL所以我最有可能在做的事情是错误的,在这一点上。是我的 SerializeObjectToXmlString
功能的问题,它并不处理化的一个 byte[]
正确,也许 OpenXML
SQL功能甚至事实上,我送XML作为一个 NTEXT
参数。我希望serialize功能,以二进制编码正确但我可能是错误的。
任何想法是什么的问题,或者也许更好的办法节省了一大堆的影像在一次?
编辑: 我觉得发生了什么,是的程序做的 byte[]
进入a base64string,然后获得通过存储proc为base64.我然后拯救这个base64string入图像的领域中SQL和阅读它,因为一个 btye[]
.因此,我认为我需要以某种方式得到它从base64到 byte[]
之前插入它在我的桌子吗?
编辑: 我开始觉得我的唯一选择是改变储存proc只是做1图像的时间,而不是使用XML,只是通过在 byte[]
作为一个 Image
类型和包装所有的电话在一个交易。
解决方案
作为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化)
其他提示
而不是将它XML,我会serialize它字节[]和存储,在varbinary(最大值)的类型领域在数据库中。
你可以尝试将其转换为base64,然后把它保存文本领域或东西。