- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 
                        static Concept()
        {
            s_deserialize = new Dictionary<string, deserializationHandler>
                                {{"1.0", (deserialize_1_0)}};
        }
        private static void serialize(Concept concept, BinaryWriter writer)
  {
            writer.Write ( concept.Name );
            writer.Write ( concept.Score );
            writer.Write ( concept.Documents.Count );
            foreach (var doc in concept.Documents)
                writer.Write(doc.ToString());
            writer.Write ( concept.Nested.Count );
            foreach (var nested in concept.Nested)
                serialize ( nested, writer );
}
       public static List<Concept> Deserialize(Stream stream)
        {
            using (var reader = new BinaryReader(stream, Encoding.UTF8))
            {
                var version = reader.ReadString();
                if (!s_deserialize.ContainsKey(version))
                    throw new NotSupportedException(String.Format("Unsupported version of format. Version: {0}", version));
                var concepts = new List<Concept>(50);
                s_deserialize[version](null, concepts, reader);
                return concepts;
            }
        }
private delegate void deserializationHandler(Concept parent, IList<Concept> concepts, BinaryReader reader);
private static readonly Dictionary<string, deserializationHandler> s_deserialize;
  private static int s_lastId = 0;
       private static int getNextConceptId()
        {
            if (s_lastId == Int32.MaxValue)
                s_lastId = 0;
            return System.Threading.Interlocked.Increment(ref s_lastId);
        }
private static void deserialize_1_0(Concept parent, IList<Concept> concepts, BinaryReader reader)
		{
            for (var i = reader.ReadInt32(); i > 0; i--)
			{
                var c = new Concept(reader.ReadString(), reader.ReadDouble(), parent);
				concepts.Add(c);
                for (var d = reader.ReadInt32(); d > 0; d--)
                    c.Documents.Add(Convert.ToInt32(reader.ReadString()));
				deserialize_1_0(c, c.Nested, reader);
			}
        }
}
                                 
        
            Человек в очередной раз изобрел свой велосипед, на этот раз как сериализовать _свои_ классы  - с поддержкой версий! По тому что некоторые переменные в классе были помечены [NonSerialized] было похоже что он что то слышал про уже имеющиеся но решил как обычно что самописный - всегда лучше. Но аттрибуты оставил - на всякий пожарный :)
        
        
Комментарии (0) RSS
Добавить комментарий