这是复制方法
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); }}
它抛出此异常:
system.invalIDCastException was
unhandled Message=Unable to cast
object of type
‘KH.CharacterClasses.Freelancer’ to
type ‘KH.CharacterClasses.Job’
现在,我添加的作业类型是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修复它.傻我. 总结以上是内存溢出为你收集整理的c# – 使用序列化时出现错误全部内容,希望文章能够帮你解决c# – 使用序列化时出现错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)