当前位置: 首页 > news >正文

怎么建设手机端网站crm系统搭建

怎么建设手机端网站,crm系统搭建,做动漫的游戏 迅雷下载网站,江门网站建设技术托管目录 一#xff0c;问题表现 二、没有技术含量的解决方案 三、本人彻底的解决方案 简要说明 贴代码 思路解析 思路 一#xff0c;问题表现 示例代码如下#xff1a; [Serializable] public class NodeTest {public NodeTest (){new ListNodeTest ();}p…目录 一问题表现  二、没有技术含量的解决方案  三、本人彻底的解决方案 简要说明 贴代码 思路解析 思路 一问题表现  示例代码如下 [Serializable] public class NodeTest {public NodeTest (){new ListNodeTest ();}public string Name { get; set; }public NodeTest Parent { get; set; }public ListNodeTest Children { get; set; }}先看错误地方以上这个类要是序列化就会遇到序列化类型 Test.NodeTest 的对象时检测到循环引用。错误。 二、没有技术含量的解决方案  网上一搜几乎到处都是这两种解决方案 使用NewtonSoft.Json然后使用序列方法加上设置 ReferenceLoopHandling Newtonsoft.Json.ReferenceLoopHandling.Ignore直接在循环错误属性上加XmlIgnore特性。NodeTest nd new NodeTest ();nd.Name root;NodeTest nd1 new NodeTest ();nd1.Name child1;nd1.Parent nd;NodeTest nd2 new NodeTest ();nd2.Name child2;nd2.Parent nd;nd.Children.Add ( nd1 );nd.Children.Add ( nd2 ); 上面的实例采用第一种方法序列化是这结果 采用第二种是以下结果。 由此可见这两种方法简单粗暴没有一点技术含量。这么说是因为直接忽略了其父子关系。反序列化成对象后Parent属性为空如果需要逆向查找父对象时完全行不通。 三、本人彻底的解决方案 简要说明 首先将例中NodeTest对象进行改装让它继承自 IXmlSerializable 接口并实现为的就是在序列化和反序列化时可以自由控制以达到序列化时能包含父节点信息。其次是对他的属性Children进行改造这很重要如果继续使用List列表会出现其他问题这个后续会提到。 贴代码 现不废话贴代码代码看完看后文解析应该很容易明白NodeTest 类 [Serializable]public class NodeTest : IXmlSerializable{internal const string ROOT NodeTest;internal const string NAME Name;internal const string PARENT Parent;internal const string ELEMENT_EXISTMARK ExistMark;internal const string ELEMENT_EXIST Exist;internal const string ELEMENT_NOTEXIST NotExist;public NodeTest (){Children new NodeTestCollection ();}public string Name { get; set; }public NodeTest Parent { get; set; }[XmlArray ()]public NodeTestCollection/*ListNodeTest*/ Children { get; set; }public System.Xml.Schema.XmlSchema GetSchema (){return null;}public static void ResetSerializationStatus (){_dicAllNodes.Clear ();}private static Dictionarystring, NodeTest _dicAllNodes new Dictionarystring, NodeTest ();public void ReadXml ( System.Xml.XmlReader reader ){XmlSerializer xmlSer XmlSerializer.FromTypes ( new Type[ ] { typeof ( NodeTest ) } )[ 0 ];if ( reader.IsEmptyElement ) return;while ( reader.NodeType ! System.Xml.XmlNodeType.EndElement ){reader.ReadStartElement ( ROOT );reader.ReadStartElement ( NAME );this.Name reader.ReadString ();reader.ReadEndElement ();reader.MoveToContent ();string sExistMark ELEMENT_NOTEXIST;if ( reader.MoveToAttribute ( ELEMENT_EXISTMARK ) ){sExistMark reader.GetAttribute ( ELEMENT_EXISTMARK );}reader.ReadStartElement ( PARENT );switch ( sExistMark ){case ELEMENT_EXIST:reader.ReadStartElement ( NAME );Parent new NodeTest ();Parent.Name reader.ReadString ();reader.ReadEndElement ();reader.ReadEndElement ();break;default:break;}XmlSerializer xmlSer2 XmlSerializer.FromTypes ( new Type[ ] { typeof ( NodeTestCollection ) } )[ 0 ];Children ( NodeTestCollection )xmlSer2.Deserialize ( reader );if ( Children.Count ! 0 ){reader.ReadEndElement ();}_dicAllNodes.Add ( this.Name, this );}for ( int i 0 ; i Children.Count ; i ){var child Children[ i ];if ( child.Parent ! null ){child.Parent _dicAllNodes[ child.Parent.Name ];}}}public void WriteXml ( System.Xml.XmlWriter writer ){XmlSerializer xmlSer XmlSerializer.FromTypes ( new Type[ ] { typeof ( NodeTest ) } )[ 0 ];writer.WriteStartElement ( NAME );writer.WriteString ( this.Name );writer.WriteEndElement ();writer.WriteStartElement ( PARENT );if ( Parent ! null ){writer.WriteAttributeString ( ELEMENT_EXISTMARK, ELEMENT_EXIST );writer.WriteStartElement ( NAME );writer.WriteString ( Parent.Name );writer.WriteEndElement ();}else{writer.WriteAttributeString ( ELEMENT_EXISTMARK, ELEMENT_NOTEXIST );}writer.WriteEndElement ();writer.Flush ();XmlSerializer xmlSer2 XmlSerializer.FromTypes ( new Type[ ] { typeof ( NodeTestCollection ) } )[ 0 ];xmlSer2.Serialize ( writer, this.Children );writer.Flush ();writer.Flush ();}}ListNodeTest改成NodeTestCollection解决序列化时结构错乱问题本来打算细说的算了懒得打字了看客自己试试就知道了此改动还很利于后续的优化扩展比如名字索引等实现如下 [Serializable][XmlRoot(ElementName Children )]public class NodeTestCollection : IListNodeTest, IXmlSerializable{private const string ROOT Children;private const string CHILDCOUNT ChildCount;#region 继承实现自IListNodeTestprivate IListNodeTest m_lstNodes new ListNodeTest ();public int IndexOf ( NodeTest item ){int iIdx -1;for ( int i 0 ; i m_lstNodes.Count ; i ){if ( m_lstNodes[ i ] item ){iIdx i;break;}}return iIdx;}public void Insert ( int index, NodeTest item ){m_lstNodes.Insert ( index, item );}[XmlElement ( NodeTest, Type typeof ( NodeTest ) )]public NodeTest this[ int index ]{get{return m_lstNodes[ index ];}set{m_lstNodes[ index ] value;}}public void Add ( NodeTest item ){m_lstNodes.Add ( item );}public bool Contains ( NodeTest item ){return m_lstNodes.Contains ( item );}public void CopyTo ( NodeTest[ ] array, int arrayIndex ){m_lstNodes.CopyTo ( array, arrayIndex );}public bool Remove ( NodeTest item ){return m_lstNodes.Remove ( item );}IEnumeratorNodeTest IEnumerableNodeTest.GetEnumerator (){return m_lstNodes.GetEnumerator ();}public void RemoveAt ( int index ){m_lstNodes.RemoveAt ( index );}public void Clear (){m_lstNodes.Clear ();}public int Count{get { return m_lstNodes.Count; }}public bool IsReadOnly{get { return false; }}System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator (){return m_lstNodes.GetEnumerator ();}#endregionpublic System.Xml.Schema.XmlSchema GetSchema (){return null;}public void ReadXml ( System.Xml.XmlReader reader ){//if ( reader.IsEmptyElement ) return;int iChildCount 0;if ( reader.MoveToAttribute ( CHILDCOUNT ) ) iChildCount int.Parse ( reader.GetAttribute ( CHILDCOUNT ) );reader.ReadStartElement ( ROOT );if (iChildCount 0){XmlSerializer xmlSer XmlSerializer.FromTypes ( new Type[ ] { typeof ( NodeTest ) } )[ 0 ];for ( int i 0 ; i iChildCount ; i ){var readerSub reader.ReadSubtree();this.Add ( ( NodeTest )xmlSer.Deserialize ( readerSub ) );reader.ReadEndElement ();}}}public void WriteXml ( System.Xml.XmlWriter writer ){int iCnt this.Count;writer.WriteAttributeString ( CHILDCOUNT, iCnt.ToString () );XmlSerializer xmlSer XmlSerializer.FromTypes ( new Type[ ] { typeof ( NodeTest ) } )[ 0 ];for ( int i 0 ; i iCnt ; i ){xmlSer.Serialize ( writer, this[ i ] );}}}思路解析 说说思路改造的地方不多主要是继承方法的实现上也就是ReadXml 和WriteXml方法实现上。在实现它们时采用一点手段在方法体类对循环引用的对象进行区别处理。 思路 原理很简单循环引用的地方在本例中即Parent对象采用简单存储存储一个指引信息这里为图简洁直接使用Name属性作为指引【后续各位观众具体使用是可以使用唯一标识符进行优化在此我就不改了】。将所有NodeTest对象信息存为字典在反序列化时使用指引进行挂接因为这是class是引用对象简单一改全部挂接完成挂接处就是For循环处。 此外还有两处XmlAttribute——ExistMark和ChildCount分别用来辅助Parent存在时检测以及子节点存在检测。 采用这个方法序列化出来如下图 反序列化也成功进行挂接不信你试试。 原理就这么简单。 不懂就留言吧。
http://www.dnsts.com.cn/news/153512.html

相关文章:

  • 什么叫微网站班级网站开发报告
  • 在哪建设网站代练平台
  • 用织梦网站后台发布文章为什么还需要审核威海那家做网站好
  • 大型网站建设用什么系统好和孕妇做网站
  • 用dw做网站怎么给链接柳州专业做网站设计
  • 东莞中小企业网站建设韶关城乡建设部网站首页
  • 网站界面设计内容WordPress模板推荐国外
  • 邹城网站设计德州营销型网站
  • 怎么弄一个自己的网址网站建设包含seo吗
  • 西安网站改版的公司pr
  • 网站建设培训班价格狼雨的seo教程
  • 网站流量超标福建建设网站
  • 百度推广费深圳网站优化团队
  • 上海网站设计价温州最好的seo
  • 那些因素会影响网站的排名位置网站 用php asp源码 比较好
  • 医疗器械公司网站备案怎么做宁波谷歌seo推广公司
  • 青岛专业网站开发公司嘉兴seo公司网站
  • 福州网站建设 联系yanktcn 05基于wordpress多商户
  • 广西城市建设学校学生网站网页设计与制作实训报告心得
  • 深圳网站建设小程序天安云谷室内设计需要什么学历
  • 做网站就是做信息整合微网站菜单
  • 网站流量分析怎么做行业网站分类
  • 凡科网网站后台建设响应式网站建设好么
  • 网站结构是体现的桂林市内必去的地方
  • 二级网站收录做推广网站费用
  • html5 微信网站主流开发技术标准泰州市高港区建设局网站
  • 深圳做公司英文网站多少钱公司网站建设多少钱
  • 如何降低网站跳出率天津公司网站的建设
  • 网站js下载wordpress换域名代码
  • 网站开发时间表如何起手做网站项目