SQL 데이터베이스에 저장할 이미지로 객체 직렬화
-
13-09-2019 - |
문제
다음과 같은 개체가 있습니다.
[Serializable]
public class ExampleImage
{
public int ID { get; set; }
public string Filename { get; set; }
public byte[] Content { get; set; }
}
나는 이것을 a에 보관한다 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[]
DB에 제대로 저장되지 않습니다. 다른 분야는 괜찮습니다. XML을 통해 이진 데이터를 SQL로 보내려고 시도한 것은이 시점에서 문제가 발생할 가능성이 가장 높습니다. 내 SerializeObjectToXmlString
문제를 작동 시키면 A의 직렬화를 처리하지 않습니다. byte[]
적절하게, 아마도 OpenXML
NTEXT
파라. 직렬화 기능이 이진을 올바르게 인코딩 할 것으로 예상하지만 잘못 될 수 있습니다.
편집하다: 나는 무슨 일이 일어나고 있다고 생각합니다. 시리얼 라이저가 byte[]
btye[]
. 그래서 나는 어떻게 든 base64에서 byte[]
내 테이블에 삽입하기 전에?
편집하다: 내 유일한 옵션은 저장된 Proc를 한 번에 1 개의 이미지를 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로 직렬화하는 대신 바이트 []로 직렬화하고 DB의 varbinary (max) 유형 필드에 저장합니다.
Base64로 변환 한 다음 텍스트 필드 등으로 저장할 수 있습니다.