- 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
Добавить комментарий