2010-05-05 5 views
3

그래서, 나는 다음과 같은 정의 (상당히 무해)가 다음 조립, 함께 일하고 있어요 :왜 처음부터 직렬화해야합니까?

public class QueryDefinition 
{ 
    private List<QueryFilter> TheCurrentFilters = null; 

    public List<QueryFilter> CurrentFilters 
    { 
     set { TheCurrentFilters = value; } 
     get { return TheCurrentFilters; } 
    } 

    // other code 

    public class QueryFilter 
    { 
     // member variables are: seven public string's & two public int's 

     public override string ToString() 
     { 
      return FilterText; 
     } 
    } 
} 

다른 어셈블리 내에서, 우리는 UserControl이 있습니다

public partial class QueryWizard : UserControl 
{ 
    private List<QueryDefinition.QueryFilter> TheCurrentFilters = null; 

    public List<QueryDefinition.QueryFilter> CurrentFilters 
    { 
     set { TheCurrentFilters = value; } 
     get { return TheCurrentFilters; } 
    } 

    // other code 
} 

재미있는 코드를하지만, 그게 내가해야만하는 일이야.

'System.Runtime.Serialization.SerializationException : 나는 (참고 문헌이 UserControl을 그), 폼을 만든 다음 폼에 컨트롤을 드롭 다른 프로젝트로 이동하는 경우

은 어쨌든, 나는이 오류 : 형식 QueryDefinition + QueryFilter '어셈블리에서 ... serializable로 표시되어 있지 않습니다.'

실제로이 serialization 코드를 사용하지 않으므로이 QueryFilter 목록 중 SerializationException의 이유는 무엇입니까?

[Serializable] 태그를 사용하여이 문제를 해결했습니다. 하지만 최근에 우리는 프로젝트 (비주얼 WebGUI 업 그레 이드)를 재건하고 있었고 이제는 "deserialization에 필요한 유형을로드 할 수 없습니다"문제가 발생합니다. 그 문제를 알아내는 대신, 나는 왜 우리가 처음부터 직렬화 태그가 필요한지 알아 내려고 노력하기로 결정했다! 감사.

+0

예외 – Andrey

답변

2

디자이너가 usercontrols "CurrentFilters"속성의 내용을 양식 초기화 코드로 serialize하려고하기 때문입니다.

DesignerSerializationVisibility 속성을 확인하십시오 : 당신이 문제를 해결해야 숨겨진로 설정하면 CurrentFilters 속성의 디자인 타임 편집을 지원하지 않으려면 http://msdn.microsoft.com/en-us/library/system.componentmodel.designerserializationvisibility.aspx

(나는 생각을 나는 윈폼 컨트롤을 내장하기 때문에, 나이였다)를

+0

적시하고, 정답의 스택 추적에서보세요! 나는 그것을 매우 고맙게 생각한다. 당신을위한 녹색 체크 마크! – JustLooking

2

CurrentFilters의 실제 값은 BinaryFormatter를 사용하여 직렬화되고 .resx 파일에 저장됩니다. 거의 확실하게 이런 일이 일어나기를 원하지 않습니다. 하나는 QueryFilter 클래스가 들어있는 어셈블리의 [AssemblyVersion] 번호에 종속됩니다. 당신이 지금 얻을 수있는 "타입을로드 할 수 없습니다"예외를 설명해야합니다.

먼저 CurrentFilters가 디자인 타임에 값으로 끝나는 방법을 찾아보십시오. 디자인 타임에 실행되는 이벤트에주의해야합니다. 일반적인 후보는 생성자 및 Load 이벤트입니다. Control.DesignTime 속성을 사용하면 코드가 실행되지 않습니다.

다음, 속성을 적용하여 속성 값이 지속되지 않도록 :

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public List<QueryFilter> CurrentFilters 
{ 
} 
+0

스폿 - 온. 시간 내 주셔서 정말 고마워요. 나는 대답을 upvoted,하지만 난 녹색 체크 표시 Roger 것 같아요. 나는 당신에게 그것을 줄 수 있었으면 좋겠지 만, Roger가 조금 더 필요로하는 것처럼 보입니다. 일생 동안 충분한 점수를 받았습니다! – JustLooking

관련 문제