2008-10-01 19 views
6

Stworzyłem niewizualny komponent w języku C#, który został zaprojektowany jako symbol zastępczy metadanych w formularzu.
Komponent ma właściwość, która jest zbiorem niestandardowych obiektów, ten obiekt jest oznaczony jako Serializowalny i implementuje GetObjectData do serwilizowania i publicznego elementu do deziletyzacji.
Serializacja czasu projektowania w C#

W pliku Resx formularza wygeneruje dane binarne do przechowywania kolekcji, jednak za każdym razem, gdy dokonam zmiany w klasie zserializowanej, otrzymuję błędy projektanta i muszę ręcznie usunąć dane z pliku resx i następnie odtwórz te dane.

Próbowałem zmieniając constuctor mieć blok try/catch wokół każdego obiektu w klasie

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

ale ciągle wywala. Ostatnim błędem, jaki dostałem, było to, że musiałem wdrożyć IConvertible.

Wolałbym korzystać z serializacji xml, ponieważ mogę ją przynajmniej zobaczyć, czy jest to możliwe do wykorzystania przez projektanta?

Czy istnieje sposób na uczynienie serializacji bardziej stabilną i mniej odporną na zmiany?

Edit:
Więcej informacji ... lepszy opis może
Mam klasy, która dziedziczy z Component, ma jedną właściwość, która jest zbiorem reguł. Wydaje się, że RulesCollection jest oznaczony jako Serializable, w przeciwnym razie nie zachowa swoich członków.

Klasa Reguły jest również składnikiem z atrybutem DesignTimeVisible (false), aby zatrzymać go w zasobniku komponentu, to nie jest oznaczone Serializable.

Posiadanie kolekcji oznaczonej jako Serializable generuje dane binarne w pliku resx (nie jest to idealne), a raport IDE informuje, że klasa Reguły nie jest możliwa do Serializacji.

Myślę, że ten problem wykracza poza proste pytanie. Prawdopodobnie wkrótce to zakończę.
Jeśli ktoś ma jakieś linki do czegoś podobnego, które bardzo by pomogło.

Odpowiedz

2

Od tamtej pory odkryłem, gdzie się nie udawało.

Komponent I, który implementował niestandardową kolekcję (odziedziczoną po CollectionBase), zmieniłem to na Listę i dodałem atrybut DesignerSerializationVisibility (DesignerSerializationVisibility.Content) do właściwości List, ta lista jest również przeznaczona tylko do odczytu. Następnie wygeneruje kod generujący wszystkie właściwości składników i wszystkie pozycje na liście.

Klasa zapisana na liście nie wymagała żadnych szczególnych atrybutów ani nie wymaga serializowania.

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

Możesz spróbować alternatywnego podejścia do uzyskania wszystkiego, aby serializować jako wygenerowany kod. Aby to zrobić, jest bardzo proste. Po prostu zaimplementuj swoją nie-wizualną klasę z Komponent. Następnie ujawnij swoją kolekcję, tak jak już to robisz, ale upewnij się, że każdy obiekt umieszczony w kolekcji sam pochodzi od Komponent. W ten sposób wszystko jest generowane przez kod.

+0

Wydaje się, że metoda ta daje również binarnych danych odcinkach, plus każdy obiekt w kolekcji jest reprezentowany na tacy składnika – benPearce

+0

zapobiec pojawiające się w zasobniku przy użyciu ... [ToolboxItem (false)] ... na klasa. Używam tego podejścia przez cały czas i nie otrzymuję danych binarnych. Musisz więc robić coś, co zmusza do tego. Czy możesz opublikować fragment kodu? –

2

Czy możesz dodać więcej kodu klasy, która ma problem z serializacją, może konstruktor i właściwość, aby podać odwołanie do zmiennych, których używasz.

Tylko uwaga: miałem wiele problemów z wizualnym pokolenia projektantów i kodu, jeśli mam obiekt na kontrolę wtedy zazwyczaj kładę

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden) ]

na nieruchomości i samodzielnie obsłużyć inicjalizację.

+0

gdzie masz do czynienia z initilization? Czy jest wymagany interfejs, czy jest on w konstruktorze? – benPearce

+0

W konstruktorze lub w wydarzeniu OnLoad na formularzu – Jiminy

+0

Twoja sugestia zadziałała dla chłopaków tutaj w pracy. Dzięki! –