Тонка настройка сериализации в Visual C # (Sharp)

Коли маємо справу з сериализацией, може виникнути ситуація, коли определеятся текстовий або двійковий формат вимагає додаткової обробки Крім цього, може бути бажаним не наражати сериализации деякі обєкти

Іноді мені здається, що існує стільки файлових форматів, скільки песчок на пляжі Тим не менш, в більшості випадків сериализация буде виконано Але в деяких випадках може бути необхідним виконати тонку нтройку сериализации

Багато способи сериализации дозволяють індивідуальну сериализацию опреденного обєкта Серіалізация за замовчуванням увазі певний мааллінг Наприклад, це може означати, що ціле число буде маршаллізовано в інше уявлення як ціле число Але іноді може бути бажаним в різних потоках мати різні уявлення У такому випадку необхідно реалізувати маршаллінг члена даних самостійно Для більшості плаорм сериализации означає реалізацію певного інтерфейсу

Далі наводиться вихідний код для виконання індивідуальної сериализации довічного потоку NET:

[Serializable]

class MyObject : ISerializable { int value

public MyObject() { }

public MyObject(Serializationlnfo info, StreamingContext context) { size = intParse(infoGetValue(&quotvalue&quot, typeof(string)))

}

public void GetObjectData(Serializationlnfo info, StreamingContext context) {

infoAddValue(&quotvalue&quot, valueToString())

}

}

У даному прикладі реалізується інтерфейс System Runtime Serialization ISeria-lizable Це означає, що коли форматер BinaryFormatter виконує серіалізуются або десеріалізацію, то форматер BinaryFormatter обєкта MyObject не маніпулюватиме двійковим потоком, а делегує це завдання обєкту MyObject Багато платформи сериализации мають явний метод, властивість або прапор для УКАН, записується чи MyObject в потік або ж зчитується з нього У випадку з двійковій сериализацией, коли обєкт записується в потік, викликається метод GetObjectData (), а коли зчитується, то викликається конструктор MyObject ()

Серіалізация йде в двох напрямках, і розробник повинен реалізувати їх обидва і однаковим способом У прикладі викликається метод AddvalueO, вказуючи, що член даних записується у вигляді рядка і повинен зчитуватися також у вигляді рядка

ПРИМІТКА

Однією з найбільших проблем з сериализацией є те, що кожна плаорма сериализации, здається, має власний спосіб роботи Іноді можуть бути загальні методи і атрибути, але в інших випадках їх немає Універсального підходу до сіалізаціі не існує Слід уникати виконання індивідуальної серіалаціі завжди, коли це можливо Більшість платформ сериализации досить розумно і знає, що робити з кожним членом даних Тому кращим підходом бет надати платформі сериализации можливість обчислити, яким чином виконати завдання

Оголошення члена даних що не підлягає сериализации

У прикладі з типом Ticket всі члени даних можна було серіалізовать Але інда це небажано Припустимо, що обєкт, який ви хочете серіалізовать, має мережеве підключення При сериализации обєкта мережеве підключення тає буде серіалізовані, що неправильно Мережеве підключення не слід серіізовивать з тієї причини, що цей обєкт є тимчасовим і застосуємо толо в контексті примірника обєкта

Часто для позначки обєкта, що не підлягає сериализации, застосовуються атрибути, як показано в наступному прикладі:

[Serializabie] class MyObject2 {

[NonSerialized]

private int  networkIdentif ier

}

Тут обєкт _networkidentifier НЕ БУДЕ записуватися або зчитуватися з поту даних

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*