c# – 使用序列化时出现错误
发布时间:2020-12-15 21:14:07 所属栏目:百科 来源:网络整理
导读:我前一段时间问过这个问题,但没有得到一个可用的答案.基本上,由于无效的强制转换异常,我无法获取复制对象的方法.但是我可以在复制方法之外把事情搞得很好. 这是复制方法 public static class ObjectDuplicator{ public static T CloneT(T source) { if (!typ
我前一段时间问过这个问题,但没有得到一个可用的答案.基本上,由于无效的强制转换异常,我无法获取复制对象的方法.但是我可以在复制方法之外把事情搞得很好.
这是复制方法 public static class ObjectDuplicator { public static T Clone<T>(T source) { if (!typeof(T).IsSerializable) { throw new ArgumentException("the Type must be serializable.","source"); } if (Object.ReferenceEquals(source,null)) //dont try to serialize a null object { return default(T); } IFormatter formatter = new BinaryFormatter(); Stream stream = new MemoryStream(); using (stream) { formatter.Serialize(stream,source); stream.Seek(0,SeekOrigin.Begin); return (T)formatter.Deserialize(stream); } } } 问题是:当我使用下面的代码调用此方法时 public void AddJob(Job job) { if (!Jobs.Contains(job)) { Job newcopy = Utilities.ObjectDuplicator.Clone<Job>(job); Jobs.Add(newcopy); } } 它抛出此异常:
现在,我添加的作业类型是Job(自由职业者)的继承类,这两个类的代码如下 [Serializable] public class Job : Ability { protected JobCommand basecommand1; protected JobCommand basecommand2; protected JobCommand basecommand3; protected JobCommand basecommand4; protected JobCommand command1; protected JobCommand command2; protected JobCommand command3; protected JobCommand command4; bool mastered; protected FFJob job; protected string name; int level; public FFJob SetJob { get { return job; } } public bool Mastered { get { return mastered; } } public JobCommand Command1 { get { return command1; } set { command1 = value; } } public JobCommand DefaultCommand1 { get { return basecommand1; } } public JobCommand Command2 { get { return command2; } set { command2 = value; } } public JobCommand DefaultCommand2 { get { return basecommand2; } } public JobCommand Command3 { get { return command3; } set { command3 = value; } } public JobCommand DefaultCommand3 { get { return basecommand3; } } public JobCommand Command4 { get { return command4; } set { command4 = value; } } public JobCommand DefaultCommand4 { get { return basecommand4; } } public Job(string name,string description,int jobID) : base(name,description,jobID,-1,null,-1) { } public static bool operator ==(Job job1,Job job2) { if (System.Object.ReferenceEquals(job1,job2)) return true; if (((object)job1 == null) || ((object)job2 == null)) return false; return (job1.Name == job2.Name && job1.UID == job2.UID); } public static bool operator !=(Job job1,Job job2) { return !(job1 == job2); } // public abstract void CharacterModifier(BaseCharacter character); // public abstract void CharacterDemodifier(BaseCharacter character); } [Serializable] public class Freelancer : Job { public Freelancer() : base("Freelancer","A character not specializing in any class. Can combine the power of all mastered Jobs.",Globals.JobID.ID) { basecommand1 = JobCommand.Attack; basecommand2 = JobCommand.Free; basecommand3 = JobCommand.Free; basecommand4 = JobCommand.Items; command1 = basecommand1; command2 = basecommand2; command3 = basecommand3; command4 = basecommand4; job = FFJob.Freelancer; } } 我真的不知道问题是什么.正如我所说的,在这种方法之外,cast的工作正常,我知道这段代码以前有用过.有任何想法吗? 谢谢 解决方法
我想到了.在某些时候,我将它编译为.dll以在另一个项目中引用.我忘了从bin目录中删除.dll,所以程序从dll加载我的类,而不是从新版本的代码加载.我意识到,在我尝试直接复制相同类型的对象后,看到它是从.dll和.exe中引用的东西.删除.dll修复它.傻我.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |