[英]Datacontract serialization/serialization with images
我有一个带有图像的类,该图像必须根据(是否嵌入)图像进行(有时)序列化/反序列化。
[DataContract(IsReference = true)]
public class Data
{
[DataContract(IsReference = true)]
public class MyImage
{
[DataMember]
int WidthStorage
[DataMember]
int HeightStorage;
[DataMember]
public string strImageLocation;
[DataMember]
public Image ImageEmbedded = new Image();<----- not working null
public bool GetImage(Image image, int width, int height)
{
...
}
public void SetImageFSlocation(string _strImageLocation, int _widthStorage, int _heightStorage)
{
...
}
public void SetImageEmbedded(string strPathFilename, int _widthStorage, int _heightStorage)
{
...
}
}
所以问题是尽管
public Image ImageEmbedded = new Image();
ImageEmbedded始终为null。 所以我把它放在像
[DataContract(IsReference = true)]
public class MyImage
{
public MyImage()
{
ImageEmbedded = new Image();
}
...
但是当我这样做时,我得到一个序列化错误。 那我该怎么办? 我不会将Image转换为byte []或其他。 我选择Datacontract序列化是因为我认为它可以对图像进行序列化。 谢谢
代码中存在一个主要问题:在WPF中,如果序列化Image,则序列化System.Windows.Controls.Image。 简而言之,序列化控件是没有意义的。 相反,您可能想要序列化BitmapSource
但是在这里再次无法序列化,因此您必须将它们转换为byte[]
。
[DataMember]
public byte[] bytesBitmapEmbedded;
然后只需将其更改为BitmapSource或byte []:
bytesBitmapEmbedded = Converter.BitmapSource2ByteArray(bitmapSource);
要么
bitmapSource = Converter.ByteArray2BitmapSource(bytesBitmapEmbedded);
与
public static class Converter
{
public static byte[] BitmapSource2ByteArray(BitmapSource bitmap)
{
using (var stream = new MemoryStream())
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
encoder.Save(stream);
return stream.ToArray();
}
}
public static BitmapSource ByteArray2BitmapSource(byte[] buffer)
{
using (var stream = new MemoryStream(buffer))
{
return BitmapFrame.Create(stream,
BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
}
}
如果您的序列化器不直接知道如何转换字段的类型,那么您将与风搏斗。 较简单的解决方案是还原为大多数语言中使用的更多原始类型。 创建一个数据传输对象 。 例如,我使用protobuf.net使用类似以下内容(根据您的需要进行编辑)存储了大量的1-二维数据:
[DataContract]
class ImageDTO
{
[DataMember(Order = 1)]
public int Width { get; set; }
[DataMember(Order = 2)]
public int Height { get; set; }
[DataMember(Order = 3)]
public ImageFormat Format { get; set; }
[DataMember(Order = 4)]
public byte[] Data { get; set; }
[DataMember(Order = 5)]
public string AltUrl { get; set; }
}
因此,在您的情况下,您只需要处理图像格式的枚举代码并从图像中获取二进制数据。 请参阅将图像转换为字节数组或将WPF图像 转换为字节的最快方法 []或https://github.com/teichgraf/WriteableBitmapEx/
然后,您可以简单地将此ImageDTO
任何实例ImageDTO
几乎所有基于合约的序列化器/反序列化器。 例如,如果选择协议缓冲区,则在.net区域中可以使用protobuf.net进行序列化 ,而在javascript区域中,可以使用protobuf.js进行反序列化(给定.proto
message ImageDTO {
optional int32 Width = 1 [default = 0];
optional int32 Height = 2 [default = 0];
optional ImageFormat Format = 3 [default = RGB];
optional bytes Data = 4;
optional string AltUrl = 5;
}
enum ImageFormat {
RGB = 0;
RGBA = 1;
PNG = 2;
JPEG = 3;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.