【问题标题】:Serialization of struct objects by webservicesWeb服务对结构对象的序列化
【发布时间】:2010-10-06 15:53:18
【问题描述】:

我通过添加一些基本字段来“扩展” System.DateTime 结构。理想情况下,我希望能够通过 web 服务将此对象传递给 winforms 客户端。

我已将结构类型标记为[Serializable],它还实现了ISerializable,但是如果我检查Web 服务提供的XML,它只包含对象的空标记。

到处都设置断点让我相信,当对象脱水时,ISerializable 方法void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 似乎永远不会被调用。

出于多种原因,我更愿意将其保留为结构,但如有必要,会将其转换为类。

有谁知道为什么 GetObjectData 在为 web 服务响应准备数据时被 .net 框架忽略?我正在使用的结构包含一个 DateTime 成员和一些布尔值。

请注意,这是 .net 2.0!

干杯

【问题讨论】:

    标签: c# web-services serialization .net-2.0


    【解决方案1】:

    首先,网络服务使用XmlSerializer - 所以你需要IXmlSerializable 来进行自定义序列化。标准的XmlSerializer 序列化只作用于同时具有getter 和setter 的公共属性。

    其次,结构通常不能很好地用作 Web 服务 DTO 对象;特别是,XmlSerializer 要求事物是可变的……哪些结构不应该。

    我个人会使用一个类。如果您能提供更多信息,我可能会说更多...

    例如:

    [Serializable]
    public class FunkyTime
    {
        [XmlAttribute]
        public DateTime When { get; set; }
        [XmlAttribute]
        public bool IsStart { get; set; }
        [XmlAttribute]
        public bool IsEnd { get; set; }
    }
    

    (请注意,您可以通过各种方式调整 xml 布局/名称)

    【讨论】:

    • 谢谢,这是我需要实现的 IXmlSerializable 接口,它一切正常 - 仍在结构中!
    • 在我的具体实例中,我没有使用 [XmlAttribute] 标签,因为我有一组特定的优化值,我在脱水状态下传递这些值。我在 WriteXml() 期间准备这个并在 ReadXml() 期间重新水化结构。
    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多