Серіалізація Generic Dictionary
клас herb_pos < перемінна x : float ; перемінна : float ; var z : float ; >
var трави: GameObject []; var load_herbs = новий масив ( ); var herb_proto : GameObject ;
функція Write ( ) < var w : herb_pos = new herb_pos ( ) ; трави = GameObject . FindGameObjectsWithTag ( "трава"); var fs : FileStream = new FileStream ( "herb.sbin" , FileMode. Create ) ; var bf : BinaryFormatter = new BinaryFormatter ( ) ; перемінна herb_count : int = трави. довжина ; bf. Серіалізація (fs, herb_count) ; for ( var herb : GameObject in herbs ) < ш. х = трава. трансформувати. позиція . x ; ш. y = трава. трансформувати. позиція . y ; ш. z = трава. трансформувати. позиція . z ; bf. Серіалізація (fs, w); > fs. Закрити ( ); >
Re: Серіалізація загального словника
Бенджамін Мур 08 серпня 2014, 22:00
і об'явіть як поле
і Ви нічого не побачите в існпекторі
хоча якщо зробите так
Re: Серіалізація загального словника
IDoNotExist 08 серпня 2014, 22:37
Куда їх убирати? В чем смысл? Якщо мені потрібні були тільки значення, я взяв би Список, речь іде саме про Словник.
Я розумію, що ніяк, питання було про те, як кастомізувати серіалізацію.
і об'явіть як поле
і Ви нічого не побачите в існпекторі
хоча якщо зробите так
Re: Серіалізація загального словника
BlackMamba 08 серпня 2014, 23:07
імхо, найпростіший спосіб серіалізації/десеріалізації це використання BinaryFormatter - серіалізує будь-який об'єкт з атрибутом Serializable, якщо він складається з, опять же, серіалізованих полів, успішно працює з масивами таких типів. могу подкинуть пищу для размышлений "приблизительным кодом" - не факт,что сразу зарабатывает.
за допомогою системи; використання System.IO ; використання System.Collections.Generic ; використання System.Linq ; використання System.Runtime.Serialization.Formatters.Binary ;
[ Serializable ] публічний клас SerializableDictionary < [Serializable] private struct Pair < відкритий ключ K < отримати ; набір ; > публічне значення V < отримати ; набір ; > >
приватна пара [] _пари;
публічний статичний явний оператор Словник ( SerializableDictionary з ) < if ( from == null ) генерувати новий ArgumentNullException ( "SerializableDictionary.explicit from" ) ; Словник res = новий словник ( ) ; from._pairs. Виберіть ( p => res [ p. Key ] = p. Value ) . ToArray ( ); повернути res ; > публічний статичний явний оператор SerializableDictionary ( Словник з ) < if ( from == null ) генерувати новий ArgumentNullException ( "SerializableDictionary.explicit from" ) ; SerializableDictionary sd = новий SerializableDictionary ( ) < _пари = від. Виберіть ( p => нова пара ( ) < Ключ = p. Key , Value = p. Value >) . ToArray ( ) > ; повернути sd ; >
публічний приклад недійсності ( ) < Джерело словника = новий словник ( ) ; byte [ ] dest = ( ( SerializableDictionary ) джерело ) . Серіалізувати ( ); джерело = ( Словник ) ( ціл. Десеріалізація ( ) ) ; > > публічний статичний клас Helpers < публічний статичний байт [ ] Serialize ( цей SerializableDictionary з ) < if ( from == null ) генерувати новий ArgumentNullException ( "SerializableDictionary.Serialize from" ) ; байт [] res; за допомогою ( MemoryStream ms = new MemoryStream ( ) ) < BinaryFormatter f = new BinaryFormatter ( ) ; f. Серіалізувати (мс, з) ;
рез = мс.ToArray(); ms. Close ( );
> return res; > public static SerializableDictionary Deserialize ( this byte [ ] from ) < if ( from == null ) throw new ArgumentNullException ( "SerializableDictionary.Deserialize from" ) ; SerializableDictionary to; using (MemoryStream ms = new MemoryStream ( from ) ) < BinaryFormatter f = New BinaryFormatter (); to = (SerializableDictionary) f. Deserialize (ms); ms. Close ( ); > return to; > >
з досвіду: K,V - вбудовані типи та масиви типів, крім uint, ushort і т.д., а також інші типи та їх масиви, що серіалізуються подібним чином, крім перерахувань