• XML序列化与REST WCF Data Contract匹配时遇到的2个问题


    问题一

    XML序列化与RESTful WCF Data Contract不能匹配,无法传递类的值。

    现象:

    给类加上[Serializable]Attribute,可以成功序列化,但是WCF Service不能识别。发现XML序列化与WCF Data Contract中成员的顺序必须相同。


    解决方案:

    1.类的头部清空WCF Data Contract的默认命名空间(见代码)。

    2.所有元素加上XML序列化和WCF DataMember的Order(见代码),包括被调用的类。

    using System;
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    using System.Xml.Serialization;
    
    namespace MySchool.BLL.Model.Common.User
    {
        [Serializable]
        [DataContract(Namespace = "")]
        public sealed class User
        {
            [DataMember(Order = 1)]
            [XmlElement(Order = 1)]
            public int id { get; set; }
    
            [DataMember(Order = 2)]
            [XmlElement(Order = 2)]
            public string userName { get; set; }
    
            [DataMember(Order = 3)]
            [XmlElement(Order = 3)]
            public string nickName { get; set; }
    
            //......
    
            private Profile m_profile = null;
            [DataMember(Order = 8)]
            [XmlElement(Order = 8)]
            public Profile Profile
            {
                get { return m_profile; }
                set { m_profile = value; }
            }
        }
    
        [Serializable]
        [DataContract(Namespace="")]
        public sealed class Profile
        {
            [DataMember(Order = 1)]
            [XmlElement(Order = 1)]
            public int id { get; set; }
    
            [DataMember(Order = 2)]
            [XmlElement(Order = 2)]
            public int nation { get; set; }
    
            [DataMember(Order = 3)]
            [XmlElement(Order = 3)]
            public int gender { get; set; }
    
            //...       
        }
    }

     


    问题二

    遇上List类型,WCF Service又不能识别。

    现象:

    XML序列化的对象,Service无法识别。

    解决方案:
    给[XmlElement]Attribute加上List的完整Type(见代码)。

            [DataMember(Order = 11)]
            [XmlElement(Order = 11, Type = typeof(List<SchoolGradeClass>))]
            public List<SchoolGradeClass> SchoolGradeClassList { get; set; }    

    面对上面这些问题,当Google未果的时候,该怎么办呢?经验和知识是你的救命稻草。技术是一个不断发展的事物,要求每一个技术人员终身学习的职业,学习应该成为程序员血液中的一份子!与各位技术战线的兄弟共勉。

  • 相关阅读:
    Linux停SVN提交时强制写日志
    svn文件提交时强制写注释
    ssh 登录出现的几种错误以及解决办法
    Linux内存调试工具初探-MEMWATCH
    段错误调试神器
    Linux环境下段错误的产生原因及调试方法小结
    pthread_create()之前的属性设置
    Linux netstat命令详解
    Linux route命令详解和使用示例(查看和操作IP路由表)
    tomcat最大线程数的设置
  • 原文地址:https://www.cnblogs.com/MikeYao/p/3490405.html
Copyright © 2020-2023  润新知