c# – 使用序列化时出现错误

c# – 使用序列化时出现错误,第1张

概述我前一段时间问过这个问题,但没有得到一个可用的答案.基本上,由于无效的强制转换异常,我无法获取复制对象的方法.但是我可以在复制方法之外把事情搞得很好. 这是复制方法 public static class ObjectDuplicator{ public static T Clone<T>(T source) { if (!typeof(T).IsSerializ 我前一段时间问过这个问题,但没有得到一个可用的答案.基本上,由于无效的强制转换异常,我无法获取复制对象的方法.但是我可以在复制方法之外把事情搞得很好.

这是复制方法

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# – 使用序列化时出现错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1227759.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存