gpt4 book ai didi

wcf - 在 WCF 中,我如何返回包含 System.Drawing.Image 属性的类?

转载 作者:行者123 更新时间:2023-12-02 07:54:23 26 4
gpt4 key购买 nike

我有一个 WCF 服务,它公开了一个返回包含 Image 属性的对象数组的方法(请参见下面的代码)。在同一个解决方案中,我有一个类库项目,它有一个对我的 WCF 项目的服务引用。在类库中,当我尝试“更新服务引用”时,我的代理类不可用。当我从我的类中删除“图形”属性时,我可以毫不费力地更新类库中的服务引用,并且我的代码都可以正常编译和运行。我将“图形”属性放回原处,代理类再次变得不可用。更奇怪的是,服务引用公开的唯一类是“图像”。

我在这里忽略了什么?

[Serializable]
public class PhotoDTO
{
public Guid Id { get; set; }
public Image Graphic { get; set; }
}


[ServiceContract]
public interface IGeneralService
{
[OperationContract]
PhotoDTO[] GetPhotos(Guid subsectionId);
}

最佳答案

编辑:正如 alexdej 正确指出的那样,Image 将使用 DCS 正确地序列化/反序列化,但是您必须将 DataContract 类型更改为 Bitmap 或使用配置在运行时为 System.Drawing.Image 指定一个 KnownType 位图(您无法归因于它,因为您不拥有 Image 类)。

Image 类不适合由 DataContractSerializer 进行序列化 - 它与 GDI 缓冲区和幕后内容有各种联系。 DCS 旨在表示您控制类的整个结构的数据对象。之所以会产生混淆,是因为在 3.5SP1 中,他们为 DCS 添加了序列化未使用 DataContractAttribute 标记的对象的能力(主要是为了方便那些懒得为其线路类添加属性的人)。不幸的副作用是序列化程序会愉快地尝试序列化任何旧对象,但在许多情况下(比如你的)将无法产生有用的结果。

无论哪种方式,您都需要将其转换为 byte[] 或 Stream 以通过网络传输,并将其重新水化为图像。如果您在双方都使用 WCF 和相同的 DataContract 类型(例如,不是生成的类型),您可以将 Graphic 保留为属性,但不要用 DataMember 标记它。通过调用 Image.Save 到 MemoryStream,为另一个 proprty ImageBytes(即标记为 DataMember)设置 Graphic 填充存储,然后转储字节 []。使 ImageBytes 上的集合从以相同方式传入的 byte[] 加载图形属性的内部图像存储。当对象在另一端被反序列化时(例如,反序列化器调用 ImageBytes setter),噗——你的 Graphic 属性的存储被填充,一切正常。全自动序列化/反序列化行为 - ImageBytes 属性只是一个实现细节。

关于wcf - 在 WCF 中,我如何返回包含 System.Drawing.Image 属性的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1767864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com