2008-10-01 9 views
6

폼의 메타 데이터에 대한 자리 표시 자로 디자인 된 C#에서 비 시각적 구성 요소를 만들었습니다.
구성 요소에는 사용자 지정 개체의 컬렉션 인 속성이 있습니다.이 개체는 Serializable로 표시되며 deserilizing을위한 serilizing 및 public constuctor의 GetObjectData를 구현합니다.
C#의 디자인 타임 serialization

양식의 resx 파일에서 컬렉션 저장을위한 이진 데이터를 생성하지만 일련 화 된 클래스를 변경할 때마다 디자이너 오류가 발생하고 resx 파일에서 데이터를 수동으로 삭제해야합니다. 이 데이터를 다시 작성하십시오.

I 클래스

try 
{ 
    _Name = info.GetString("Name"); 
} 
catch (SerializationException) 
{ 
    this._Name = string.Empty; 
} 

에서 각 속성 주위에 try/catch 블록을 가지고 constructor에 변경 시도했지만 여전히 충돌합니다. 내가 얻은 마지막 오류는 IConvertible을 구현해야한다는 것이 었습니다.

디자이너가 사용할 수있는 을 적어도 볼 수 있기 때문에 XML 직렬화를 선호합니다.

직렬화를보다 안정적으로 만들고 변경에 대한 저항을 줄이는 방법이 있습니까?

편집 : 자세한 내용은 ... 더 나은 설명은 아마도
내가 Component에서 상속하는 클래스가
,이 규칙의 모음입니다 하나의 속성이 있습니다. RulesCollection은 Serializable로 표시되어야하며, 그렇지 않으면 멤버를 보유하지 않습니다.

Rules 클래스는 구성 요소 트레이에 표시를 중지하는 DesignTimeVisible (false) 특성이있는 구성 요소이기도하며이 Clas는 Serializable로 표시되지 않습니다.

컬렉션을 Serializable로 표시하면 resx 파일에 이진 데이터가 생성되고 (이상적이지는 않음) IDE에서 Rules 클래스가 Serializable이 아니라고보고합니다.

저는이 문제가 간단한 질문을 넘어서고 있다고 생각합니다. 그래서 나는 곧 그것을 닫을 것입니다.
누군가가 비슷한 도움이 될만한 비슷한 링크를 갖고 있다면.

답변

2

나는 어디서 잘못되었는지 발견했다.

구성 요소가 (CollectionBase에서 상속 된) 사용자 지정 컬렉션을 구현할 때이를 List로 변경하고 ListSerializationVisibility (DesignerSerializationVisibility.Content) 특성을 List 속성에 추가했습니다.이 목록도 읽기 전용입니다. 이렇게하면 List의 모든 구성 요소 속성과 모든 항목을 생성하는 코드가 생성됩니다.

목록에 저장된 클래스는 특정 속성이 필요하지 않거나 직렬화 될 필요가 있습니다.

private List<Rule> _Rules; 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public List<Rule> Rules 
{ 
    get { return _Rules; } 
} 
2

생성 된 코드로 모든 항목을 직렬화하는 다른 방법을 시도해 볼 수 있습니다. 그렇게하는 것은 매우 쉽습니다. 비 시각 수업을 구성 요소에서 구현하십시오. 그런 다음 컬렉션을 노출 시키되 컬렉션에 배치 된 각 객체는 구성 요소에서 파생되었는지 확인하십시오. 그렇게함으로써 모든 것이 코드 생성됩니다.

+0

또한이 방법은 또한에 .. [ToolboxItem (FALSE)] ... 이진 직렬화 된 데이터를 생성 플러스 컬렉션의 모든 오브젝트는 부품 트레이 – benPearce

+0

되지 않도록 사용 트레이에 표시에 표시하는 것 같다 클래스. 나는 항상이 접근법을 사용하고 바이너리 데이터를 얻지 못한다. 그래서 당신은 그것을 강제로하는 일을해야합니다. 코드 스 니펫을 게시 할 수 있습니까? –

2

직렬화 문제가있는 클래스의 코드를 더 많이 넣을 수 있습니까? 아마도 사용중인 변수에 대한 참조를 제공하는 생성자와 속성 일 수 있습니다.

그냥 참고 : 다음 일반적으로 내가

를 넣어 컨트롤의 속성을 가지고있는 경우에 나는, 비주얼 디자이너 및 코드 생성에 문제를 많이 했어

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden) ]

속성에서 초기화를 직접 처리하십시오.

+0

어디서 초기화를 처리합니까? 필요한 인터페이스가 있거나 생성자에 있습니까? – benPearce

+0

생성자 또는 OnLoad 이벤트의 형식이 – Jiminy

+0

인 경우 직장에서 여기있는 사람들을 위해 제안이 이루어졌습니다. 감사! –

관련 문제