2011-01-04 9 views
4

잠시 전에이 질문을했지만 사용 가능한 답을 얻지 못했습니다. 기본적으로 잘못된 캐스트 예외로 인해 개체를 복제 할 수있는 방법을 얻을 수 없습니다. 하지만 나는 복제 방법 밖에서 일을 잘 할 수 있습니다. 여기 직렬화를 사용할 때 캐스팅 오류가 발생했습니다.

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; 
    } 
} 

정말 문제가 무엇인지 모르겠습니다. 앞에서 말했듯이이 메서드 외부에서 캐스팅이 잘 작동하며 이전에이 코드가 작동했다는 것을 알고 있습니다. 어떤 아이디어?

감사

+0

직렬화 코드는 괜찮아 보입니다. 나는이 정확한 일을 어딘가에서 할 것이라고 확신한다. 내가 한번 볼게. –

+0

그래, 난 파생 형식을 serialize하고 그것에 deserialization 캐스트 기본 형식 괜찮아요. 당신의 문제는 매우 이상하게 보입니다. 나는 그것을 이해하지 못합니다. 미안해. 도울 수 없어. –

+0

전체 예외 스택 추적을 제공 할 수 있습니까? 또한 내부 예외. 마지막으로, 캐스트를 'T'로 다른 라인으로 옮기면 대상을 검사 할 수 있습니다. – leppie

답변

1

나는 그것을 알아 냈다. 어떤 시점에서, 나는 그것을 다른 프로젝트에서 참조 할 .dll로 컴파일했다. bin 디렉토리에서 .dll을 삭제하는 것을 잊어 버렸습니다. 그래서 프로그램은 새로운 버전의 코드가 아니라 dll에서 클래스를로드하고있었습니다. 동일한 유형의 객체를 똑같이 복사하려고 시도한 후에 .dll과 .exe에서 무언가를 평가하는 것을 보았습니다. .dll 파일을 삭제하면 문제가 해결되었습니다. 바보 나.

0

그냥 중복을 원하는 I, 대신 직렬화, 왜 그냥 IClonable을 구현? 모든 유형에는 MemberwiseClone이라는 보호 된 메소드가있어 상당히 복잡한 작업을 쉽게 수행 할 수 있습니다.

+1

글쎄, 그냥 개체를 복제 한 다음 각 메서드에 대한 메서드를 사용하는 것이 더 쉽다고 생각합니다. – Megatron

관련 문제