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

怎么建设手机端网站如何防止网站被镜像

怎么建设手机端网站,如何防止网站被镜像,手机百度官网,中国建设银行上海分行信息网站目录 一#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.tj-hxxt.cn/news/136316.html

相关文章:

  • 阿里云虚拟主机建站教程中国做的最好的网站建设公司
  • 代做网站app苏州企业网站建站系统
  • 网站建设公司的市场营销方案无锡企业网站排名优化
  • 网站推广该怎么做网站建设推广服务商
  • 做网站怎么在图片里面插字重庆工程交易信息网
  • 源码怎么做网站中国娱乐公司三大巨头
  • 湛江网站建设湛江wordpress 301
  • 如何建立公司网站招标网站建设包括哪些东西
  • 三亚建设局网站杭州seo网站推广软件
  • 开发网站公司如何运营app网站开发框架
  • 用什么做视频网站比较好怎么做透明的网站图片
  • 网站dw建设医院做网站备案都需要什么
  • 东莞住房建设网站的网线上购买链接
  • 网站建设出现乱码北京外包公司排行榜
  • 用符号做照片的网站百度网页设计教程
  • 广州网站建设定制价格蓬莱做网站案例
  • 网站速度优化 js加载做图表的网站 免费
  • 网站建设文化流程图网站建设的建议例子
  • 备案 几个网站给境外合法网站做数据
  • 网站自助搭建平台苏州网站建设哪家好
  • 免费建设一个网站电脑版网站建设合同范本
  • 网站推广软件推广南通市城乡建设局网站
  • 做销售在那个网站找外卖网站建设的策划方案
  • 郑州的做网站公司有哪些如何用frontpage2003做网站
  • 怎么建设银行网站注册做oa系统的网站
  • 昌平网站建设公司自己的网站
  • 做中英文网站触屏版网站设计
  • ps 做ui比较好的网站青岛做网站和小程序的公司
  • h5 php网站开发深圳设计网站有哪些
  • 集团网站建设案例与网站作用湖南省建三公司官网