11using System ;
22using System . Collections . Generic ;
3- using System . Linq ;
4- using System . Reflection ;
53using BinaryFormatter . TypeConverter ;
64using BinaryFormatter . Types ;
75using System . Collections ;
86using System . IO ;
7+ using BinaryFormatter . Utils ;
98
109namespace BinaryFormatter
1110{
1211 public class BinaryConverter
1312 {
14- private static readonly List < string > excludedDlls = new List < string > { "CoreLib" , "mscorlib" } ;
15- private static readonly ConvertersSelector _selector = new ConvertersSelector ( ) ;
16-
1713 public byte [ ] Serialize ( object obj )
1814 {
1915 var stream = new MemoryStream ( ) ;
@@ -23,55 +19,37 @@ public byte[] Serialize(object obj)
2319
2420 public void Serialize ( object obj , Stream stream )
2521 {
26- if ( obj == null ) return ;
27-
28- BaseTypeConverter converter = _selector . SelectConverter ( obj ) ;
29- if ( converter != null )
30- {
31- converter . Serialize ( obj , stream ) ;
32- }
33- else
34- {
35- SerializePropertiesToStream ( obj , stream ) ;
36- }
22+ BaseTypeConverter converter = ConvertersSelector . SelectConverter ( obj ) ;
23+ converter . Serialize ( obj , stream ) ;
3724 }
3825
39- private void SerializePropertiesToStream ( object obj , Stream stream )
26+ public T Deserialize < T > ( byte [ ] stream )
4027 {
41- Type t = obj . GetType ( ) ;
42- ICollection < PropertyInfo > properties = t . GetTypeInfo ( ) . DeclaredProperties . ToArray ( ) ;
28+ var workingStream = new WorkingStream ( stream ) ;
4329
44- foreach ( PropertyInfo property in properties )
30+ SerializedType deserializedType = workingStream . ReadSerializedType ( ) ;
31+ if ( deserializedType == SerializedType . Null )
4532 {
46- object prop = property . GetValue ( obj ) ;
47- Serialize ( prop , stream ) ;
33+ return default ( T ) ;
4834 }
49- }
50-
51- public T Deserialize < T > ( byte [ ] stream )
52- {
53- Type type = typeof ( T ) ;
5435
55- BaseTypeConverter converter = _selector . SelectConverter ( type ) ;
56- if ( converter == null )
36+ Type sourceType = deserializedType . GetBaseType ( ) ;
37+ if ( sourceType == null )
5738 {
58- T instance = ( T ) Activator . CreateInstance ( type ) ;
59-
60- int offset = 0 ;
61- DeserializeObject ( stream , ref instance , ref offset ) ;
62-
63- return instance ;
39+ byte [ ] typeInfo = workingStream . ReadBytesWithSizePrefix ( ) ;
40+ sourceType = TypeUtils . FromUTF8Bytes ( typeInfo ) ;
6441 }
6542
43+ BaseTypeConverter converter = ConvertersSelector . SelectConverter ( sourceType ) ;
6644 if ( converter is IEnumerableConverter )
6745 {
68- var prepearedData = converter . DeserializeToObject ( stream ) as IEnumerable ;
46+ var preparedData = converter . DeserializeToObject ( stream ) as IEnumerable ;
6947
7048 var listType = typeof ( List < > ) ;
71- var genericArgs = type . GenericTypeArguments ;
49+ var genericArgs = sourceType . GenericTypeArguments ;
7250 var concreteType = listType . MakeGenericType ( genericArgs ) ;
7351 var data = Activator . CreateInstance ( concreteType ) ;
74- foreach ( var item in prepearedData )
52+ foreach ( var item in preparedData )
7553 {
7654 ( ( IList ) data ) . Add ( item ) ;
7755 }
@@ -80,64 +58,6 @@ public T Deserialize<T>(byte[] stream)
8058
8159 return ( T ) converter . DeserializeToObject ( stream ) ;
8260 }
83-
84- private void DeserializeObject < T > ( byte [ ] stream , ref T instance , ref int offset )
85- {
86- foreach ( PropertyInfo property in instance . GetType ( ) . GetTypeInfo ( ) . DeclaredProperties )
87- {
88- DeserializeProperty ( property , ref instance , stream , ref offset ) ;
89- if ( offset == stream . Length )
90- return ;
91- }
92- }
93-
94- private void DeserializeProperty < T > ( PropertyInfo property , ref T instance , byte [ ] stream , ref int offset )
95- {
96- if ( ! excludedDlls . Any ( x => property . PropertyType . AssemblyQualifiedName . Contains ( x ) ) )
97- {
98- object propertyValue = Activator . CreateInstance ( property . PropertyType ) ;
99- property . SetValue ( instance , propertyValue ) ;
100- DeserializeObject ( stream , ref propertyValue , ref offset ) ;
101- return ;
102- }
103-
104- Type instanceType = typeof ( T ) ;
105- TypeInfo instanceTypeInfo = instanceType . GetTypeInfo ( ) ;
106- SerializedType type = ( SerializedType ) BitConverter . ToInt16 ( stream , offset ) ;
107- offset += sizeof ( short ) ;
108-
109- BaseTypeConverter converter = _selector . ForSerializedType ( type ) ;
110- object data ;
111- if ( type == SerializedType . IEnumerable )
112- {
113- var prepearedData = converter . DeserializeToObject ( stream , ref offset ) as IEnumerable ;
114-
115- var prop = property ;
116- var listType = typeof ( List < > ) ;
117- var genericArgs = prop . PropertyType . GenericTypeArguments ;
118- var concreteType = listType . MakeGenericType ( genericArgs ) ;
119- data = Activator . CreateInstance ( concreteType ) ;
120- foreach ( var item in prepearedData )
121- {
122- ( ( IList ) data ) . Add ( item ) ;
123- }
124- }
125- else
126- {
127- data = converter . DeserializeToObject ( stream , ref offset ) ;
128- }
129-
130- if ( instanceTypeInfo . IsValueType && ! instanceTypeInfo . IsPrimitive )
131- {
132- object boxedInstance = ( object ) instance ;
133- property . SetValue ( boxedInstance , data , property . GetIndexParameters ( ) ) ;
134- instance = ( T ) boxedInstance ;
135- }
136- else
137- {
138- property . SetValue ( instance , data , property . GetIndexParameters ( ) ) ;
139- }
140- }
14161 }
14262}
14363
0 commit comments