解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System

本文介绍了解决.NET Framework 1.1中因安全级别设置导致的反序列化错误的方法。通过修改配置文件中的反序列化级别为Full,实现了一个聊天程序的远程处理功能。
部署运行你感兴趣的模型镜像

解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反序列化”错误的办法。
在.NET Framework 1.1中安全级别默认是Low的,所以不能被反序列化。以下代码是是一个聊天程序,在修改了配置文件后就可以访问了。


远程处理程序:ChatCoordinator.cs

using System;
using System.Runtime.Remoting;
using System.Collections;

[Serializable]
public class SubmitEventArgs : EventArgs{

   private string _string = null;
   private string _alias = null;

   public SubmitEventArgs(string contribution, string contributor){
      this._string = contribution;
      this._alias = contributor;
   }

   public string Contribution{
      get{
         return _string;
      }
   }

   public string Contributor{
      get {
         return _alias;
      }   
   }
}

public delegate void SubmissionEventHandler(object sender, SubmitEventArgs submitArgs);

public class ChatCoordinator : MarshalByRefObject{

   public ChatCoordinator(){
     Console.WriteLine("聊天控制对象已经建立。 实例: " + this.GetHashCode().ToString());
   }
   public override object InitializeLifetimeService(){
      return null;
   }
   public event SubmissionEventHandler Submission;

   public void Submit(string contribution, string contributor){
      Console.WriteLine("{0} 发送: {1}.", contributor, contribution);

      SubmitEventArgs e = new SubmitEventArgs(contribution, contributor);

      if (Submission != null){
  Console.WriteLine("广播……");
         Submission(this, e);
      }
   }
}

宿主应用程序:Server.cs

using System;
using System.Runtime.Remoting;

public class Server
{
   public static void Main(string[] Args)
   {
  RemotingConfiguration.Configure("Central.config");
  Console.WriteLine("服务已经启动。 按回车键退出。");
  Console.ReadLine();
   }
}

客户端应用程序:client.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

public class ChatClient : MarshalByRefObject {

   private string username = null;

 public override object InitializeLifetimeService() {
      return null;
   }

   public ChatClient(string alias){
       
      this.username = alias;
   
   }

   public void Run(){
   
      RemotingConfiguration.Configure("Client.config");
      ChatCoordinator chatcenter = new ChatCoordinator();
      chatcenter.Submission += new SubmissionEventHandler(this.SubmissionReceiver);
      String keyState = "";
       
      while (true){
         Console.WriteLine("按0和回车键退出:/r/n");
         keyState = Console.ReadLine();

         if (String.Compare(keyState,"0", true) == 0)
            break;
         chatcenter.Submit(keyState, username);
      }
      chatcenter.Submission -= new SubmissionEventHandler(this.SubmissionReceiver);
   }

 public void SubmissionReceiver(object sender, SubmitEventArgs args){

 if (String.Compare(args.Contributor, username, true) == 0){
         Console.WriteLine("你的消息经被广播。。");
      }
      else
         Console.WriteLine(args.Contributor + " 说: " + args.Contribution);
      }

   public static void Main(string[] Args){

      if (Args.Length != 1){
         Console.WriteLine("You need to type an alias.");
         return;
      }

      ChatClient client = new ChatClient(Args[0]);
         client.Run();
      }
}

服务器端配置文件:Central.config

<configuration>
  <system.runtime.remoting>
    <application>
      <service>
        <wellknown mode="Singleton" type="ChatCoordinator, ChatCoordinator" objectUri="Chat" />
      </service>
      <channels>
        <channel ref="http" port="8080">
          <!--
              以下红颜色的部分是控制按级别的
              Full: .NET 远程处理的完全反序列化级别。它在所有情况下都支持远程处理所支持的全部类型。
              Low: .NET 远程处理的低反序列化级别。它支持与基本的远程处理功能相关联的类型。
   -->
          <serverProviders>
            <provider ref="wsdl" />
            <formatter ref="soap" typeFilterLevel="Full" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

客户端配置文件:Client.config

<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown type="ChatCoordinator, ChatCoordinator" url="http://localhost:8080/Chat" />
      </client>
      <channels>
        <channel ref="http" port="0">
          <!--以下红颜色的部分是控制按级别的-->
          <serverProviders>
            <provider ref="wsdl" />
            <formatter ref="soap" typeFilterLevel="Full" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

在该目录中的命令提示处,键入以下命令就可以运行了:

csc /t:library ChatCoordinator.cs

csc /r:ChatCoordinator.dll server.cs

csc /r:ChatCoordinator.dll client.cs


 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>好的,我现在需要帮用户整理关于单链表操作实现的心得体会,包括算分析、改进方和经验教训。首先,我得回忆一下单链表的基本操作,比如入、删除查找等,以及它们的实现步骤。 用户提到了算分析,我需要分析这些操作的时间复杂度。比如,入和删除在已知节点的情况下是$O(1)$,但如果需要先查找,那就是$O(n)$。这点很重要,要明确区分不同情况下的性能差异。 接下来是改进设想。用户可能希望优化单链表的某些操作。比如,可以添加尾指针来提升尾部入的效率,这样就不用每次都遍历整个链表。另外,使用双向链表或者循环链表也是常见的改进方,但用户问的是单链表,可能需要说明这些扩展结构的不同应用场景。 经验教训部分,用户可能遇到了指针操作的问题,比如内存泄漏或者野指针。这时候需要强调正确管理指针的重要性,以及如何通过工具或测试来避免这些问题。比如,使用Valgrind检测内存泄漏,或者编写测试用例覆盖边界情况。 然后,我需要参考用户提供的引用内容。引用[1]提到链表操作和存储结构,这和用户的问题直接相关,应该引用到心得中。引用[3]涉及计算机系统知识,可能可以联系到内存管理或程序优化方面,但需要自然衔接,不能强行入。 生成相关问题的时候,要考虑用户可能进一步想知道的内容,比如单链表和双向链表的比较,或者如何测试链表代码的有效性。这些问题应该与用户的问题相关,并且帮助深化他们的理解。 最后,要确保整个回答结构清晰,分点列出,使用正确的LaTeX格式,并且引用标记自然。注意避免使用Markdown,保持口语化但专业,同时符合用户的中文要求。</think>### 单链表操作实现心得与算分析 在实现单链表操作时,核心在于理解其动态内存管理和指针操作的特性。以下是具体分析: #### 1. **算复杂度分析** - **入/删除操作**:在已知节点位置时,时间复杂度为$O(1)$(如头部入);若需遍历查找目标节点(如按值删除),则时间复杂度为$O(n)$[^3]。 - **查找操作**:必须从头节点开始遍历,时间复杂度为$O(n)$。 - **内存管理**:动态分配节点需注意内存泄漏问题,删除节点后需及时释放内存[^1]。 #### 2. **改进方** - **尾指针优化**:添加尾指针(`tail`)可提升尾部入效率,使尾操作从$O(n)$优化为$O(1)$。 - **虚拟头节点**:引入虚拟头节点(`dummyHead`)可简化边界条件处理(如空链表或头节点操作)。 - **缓存长度信息**:维护链表长度变量`size`,避免频繁遍历统计长度。 - **双向链表扩展**:若需要频繁反向操作,可改用双向链表(但需额外空间存储前驱指针)[^1]。 #### 3. **经验教训** - **指针操作陷阱**:未正确处理指针指向可能导致链表断裂(如删除节点时未更新前驱节点的`next`)。 - **内存泄漏**:动态分配的节点未释放会造成内存泄漏,可通过工具如Valgrind检测[^3]。 - **边界测试**:需覆盖空链表、单节点链表、头尾节点操作等场景,例如: ```c // 示例:删除头节点时的错误处理 if (head != NULL) { Node* temp = head; head = head->next; free(temp); } ``` - **代码可读性**:合理封装函数(如`createNode()`, `insertAfter()`),避免重复代码[^1]。 #### 4. **实际应用场景** - 适用于频繁入/删除且数据量动态变化的场景(如实现队列、LRU缓存淘汰算)。 - 链式存储结构在操作系统文件系统、内存管理中有广泛应用[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值