zoukankan      html  css  js  c++  java
  • 序列化反序列化只读属性解决方案(原创)

    /// <summary>
        /// 通过反射实现具有只读属性的类的序列化
        /// 类必私有变量必须是"_"+属性名称
        /// </summary>
        public abstract class ReadOnlySerializable : IXmlSerializable
        {
            #region XmlSerializable
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public System.Xml.Schema.XmlSchema GetSchema()
            {
                return null;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="reader"></param>
            public void ReadXml(System.Xml.XmlReader reader)
            {
                Type type = this.GetType();
                reader.ReadStartElement(type.Name);
                while (reader.Read())
                {
                    if (reader.NodeType != System.Xml.XmlNodeType.EndElement)
                    {
                        if (string.IsNullOrEmpty(reader.LocalName) == false)
                        {
                            FieldInfo field = type.GetField("_" + reader.LocalName, BindingFlags.NonPublic | BindingFlags.Instance);
    
    
                            if (field != null)
                            {
                                if (field.FieldType == typeof(string) || field.FieldType.BaseType.Equals(typeof(System.ValueType)))
                                {
                                    field.SetValue(this, Convert.ChangeType(reader.ReadString(), field.FieldType));
                                }
                                else
                                {
                                    reader.ReadStartElement();
                                    XmlSerializer xs = new XmlSerializer(field.FieldType);
                                    field.SetValue(this, xs.Deserialize(reader));
                                    reader.ReadEndElement();
                                }
                            }
                        }
                    }
                    else if (reader.NodeType == System.Xml.XmlNodeType.EndElement)
                    {
                        reader.ReadEndElement();
                        break;
                    }
                }
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="writer"></param>
            public void WriteXml(System.Xml.XmlWriter writer)
            {
                foreach (var item in this.GetType().GetProperties())
                {
                    object value = item.GetValue(this, null);
                    if (value != null)
                    {
                        if (item.PropertyType != typeof(string) && item.PropertyType.BaseType.Equals(typeof(System.ValueType)) == false)
                        {
                            writer.WriteStartElement(item.Name);
                            XmlSerializer xs = new XmlSerializer(item.PropertyType);
                            xs.Serialize(writer, value);
                            writer.WriteEndElement();
                        }
                        else
                        {
                            writer.WriteStartElement(item.Name);
                            writer.WriteString(value.ToString());
                            writer.WriteEndElement();
                        }
                    }
                }
            }
            #endregion
        }
  • 相关阅读:
    codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊
    codevs1033 蚯蚓的游戏问题 裸最小费用最大流,注意要拆点
    模板题 codevs 1993 草地排水 想学习的请看链接
    java初级易错问题总结
    JAVA基本数据类型所占字节数是多少?
    forword和重定向有什么区别?
    Spring框架注解
    hibernate利用mysql的自增张id属性实现自增长id和手动赋值id并存
    eclispe中安装hibernate插件
    struts2使用模型传值
  • 原文地址:https://www.cnblogs.com/FirstCode/p/3185820.html
Copyright © 2011-2022 走看看