-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
34b08cf
commit a69c6e0
Showing
5 changed files
with
111 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
// //----------------------------------------------------------------------- | ||
// // <copyright file="LinkedListSerializerFactory.cs" company="Asynkron HB"> | ||
// // Copyright (C) 2015-2016 Asynkron HB All rights reserved | ||
// // </copyright> | ||
// //----------------------------------------------------------------------- | ||
|
||
using System; | ||
using System.Collections; | ||
using System.Collections.Concurrent; | ||
using System.Collections.Generic; | ||
using System.IO; | ||
using System.Linq; | ||
using System.Reflection; | ||
using Wire.Extensions; | ||
using Wire.ValueSerializers; | ||
|
||
namespace Wire.SerializerFactories | ||
{ | ||
public class LinkedListSerializerFactory : ValueSerializerFactory | ||
{ | ||
public override bool CanSerialize(Serializer serializer, Type type) | ||
{ | ||
return type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(LinkedList<>); | ||
} | ||
|
||
public override bool CanDeserialize(Serializer serializer, Type type) | ||
{ | ||
return CanSerialize(serializer, type); | ||
} | ||
|
||
private static void WriteValues<T>(LinkedList<T> llist, Stream stream, Type elementType, ValueSerializer elementSerializer, | ||
SerializerSession session, bool preserveObjectReferences) | ||
{ | ||
if (preserveObjectReferences) | ||
{ | ||
session.TrackSerializedObject(llist); | ||
} | ||
|
||
Int32Serializer.WriteValueImpl(stream, llist.Count, session); | ||
foreach (var value in llist) | ||
{ | ||
stream.WriteObject(value, elementType, elementSerializer, preserveObjectReferences, session); | ||
} | ||
} | ||
|
||
private static object ReadValues<T>(Stream stream, DeserializerSession session, bool preserveObjectReferences) | ||
{ | ||
var length = stream.ReadInt32(session); | ||
var llist = new LinkedList<T>(); | ||
if (preserveObjectReferences) | ||
{ | ||
session.TrackDeserializedObject(llist); | ||
} | ||
for (var i = 0; i < length; i++) | ||
{ | ||
var value = (T)stream.ReadObject(session); | ||
llist.AddLast(value); | ||
} | ||
return llist; | ||
} | ||
|
||
public override ValueSerializer BuildSerializer(Serializer serializer, Type type, | ||
ConcurrentDictionary<Type, ValueSerializer> typeMapping) | ||
{ | ||
var arraySerializer = new ObjectSerializer(type); | ||
|
||
var elementType = type.GetGenericArguments()[0]; | ||
var elementSerializer = serializer.GetSerializerByType(elementType); | ||
var preserveObjectReferences = serializer.Options.PreserveObjectReferences; | ||
|
||
var readGeneric = GetType().GetTypeInfo().GetMethod(nameof(ReadValues), BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(elementType); | ||
var writeGeneric = GetType().GetTypeInfo().GetMethod(nameof(WriteValues), BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(elementType); | ||
|
||
ObjectReader reader = (stream, session) => | ||
{ | ||
//Stream stream, DeserializerSession session, bool preserveObjectReferences | ||
var res = readGeneric.Invoke(null, new object[] { stream, session, preserveObjectReferences }); | ||
return res; | ||
}; | ||
ObjectWriter writer = (stream, arr, session) => | ||
{ | ||
//T[] array, Stream stream, Type elementType, ValueSerializer elementSerializer, SerializerSession session, bool preserveObjectReferences | ||
writeGeneric.Invoke(null, new[] { arr, stream, elementType, elementSerializer, session, preserveObjectReferences }); | ||
}; | ||
arraySerializer.Initialize(reader, writer); | ||
typeMapping.TryAdd(type, arraySerializer); | ||
return arraySerializer; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters