잠시 전에이 질문을했지만 사용 가능한 답을 얻지 못했습니다. 기본적으로 잘못된 캐스트 예외로 인해 개체를 복제 할 수있는 방법을 얻을 수 없습니다. 하지만 나는 복제 방법 밖에서 일을 잘 할 수 있습니다. 여기 직렬화를 사용할 때 캐스팅 오류가 발생했습니다.
는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);
}
}
}
문제는 이것이다 중복 방법입니다 :
System.InvalidCastException : 나는
public void AddJob(Job job) { if (!Jobs.Contains(job)) { Job newcopy = Utilities.ObjectDuplicator.Clone<Job>(job); Jobs.Add(newcopy); } }
아래의 코드를 사용하여이 메서드를 호출 할 때이 예외가 발생합니다 이 (가) 처리되지 않음 메시지 = 캐스팅 할 수 없음 01 유형의 개체 유형 23,516,'KH.CharacterClasses.Freelancer' 'KH.CharacterClasses.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, -1, null, null, -1, -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;
}
}
정말 문제가 무엇인지 모르겠습니다. 앞에서 말했듯이이 메서드 외부에서 캐스팅이 잘 작동하며 이전에이 코드가 작동했다는 것을 알고 있습니다. 어떤 아이디어?
감사
직렬화 코드는 괜찮아 보입니다. 나는이 정확한 일을 어딘가에서 할 것이라고 확신한다. 내가 한번 볼게. –
그래, 난 파생 형식을 serialize하고 그것에 deserialization 캐스트 기본 형식 괜찮아요. 당신의 문제는 매우 이상하게 보입니다. 나는 그것을 이해하지 못합니다. 미안해. 도울 수 없어. –
전체 예외 스택 추적을 제공 할 수 있습니까? 또한 내부 예외. 마지막으로, 캐스트를 'T'로 다른 라인으로 옮기면 대상을 검사 할 수 있습니다. – leppie