1. C# / Говнокод #5254

    +112

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 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] было похоже что он что то слышал про уже имеющиеся но решил как обычно что самописный - всегда лучше. Но аттрибуты оставил - на всякий пожарный :)

    Запостил: eval_2009, 13 Января 2011

    Комментарии (0) RSS

    Добавить комментарий

    Ошибка компиляции комментария:
    1. Гости могут высказаться только во вторник, пятницу или субботу
    ava Где здесь C++, guest?!
    А не использовать ли нам bbcode?
    • [b]жирный[/b] — жирный
    • [i]курсив[/i] — курсив
    • [u]подчеркнутый[/u] — подчеркнутый
    • [s]перечеркнутый[/s] — перечеркнутый
    • [blink]мигающий[/blink] — мигающий
    • [color=red]цвет[/color] — цвет (подробнее)
    • [size=20]размер[/size] — размер (подробнее)
    • [code=<language>]some code[/code] (подробнее)
    Проверочный код