4 // Lluis Sanchez Gual (lluis@ideary.com)
6 // (C) 2003 Lluis Sanchez Gual
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 namespace System
.Runtime
.Serialization
.Formatters
.Binary
35 internal class BinaryCommon
37 // Header present in all binary serializations
38 public static byte[] BinaryHeader
= new Byte
[] {0,1,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0}
;
40 static Type
[] _typeCodesToType
;
41 static byte[] _typeCodeMap
;
42 public static bool UseReflectionSerialization
= false;
46 _typeCodesToType
= new Type
[19];
47 _typeCodesToType
[(int)BinaryTypeCode
.Boolean
] = typeof (Boolean
);
48 _typeCodesToType
[(int)BinaryTypeCode
.Byte
] = typeof (Byte
);
49 _typeCodesToType
[(int)BinaryTypeCode
.Char
] = typeof (Char
);
50 _typeCodesToType
[(int)BinaryTypeCode
.TimeSpan
] = typeof (TimeSpan
);
51 _typeCodesToType
[(int)BinaryTypeCode
.DateTime
] = typeof (DateTime
);
52 _typeCodesToType
[(int)BinaryTypeCode
.Decimal
] = typeof (Decimal
);
53 _typeCodesToType
[(int)BinaryTypeCode
.Double
] = typeof (Double
);
54 _typeCodesToType
[(int)BinaryTypeCode
.Int16
] = typeof (Int16
);
55 _typeCodesToType
[(int)BinaryTypeCode
.Int32
] = typeof (Int32
);
56 _typeCodesToType
[(int)BinaryTypeCode
.Int64
] = typeof (Int64
);
57 _typeCodesToType
[(int)BinaryTypeCode
.SByte
] = typeof (SByte
);
58 _typeCodesToType
[(int)BinaryTypeCode
.Single
] = typeof (Single
);
59 _typeCodesToType
[(int)BinaryTypeCode
.UInt16
] = typeof (UInt16
);
60 _typeCodesToType
[(int)BinaryTypeCode
.UInt32
] = typeof (UInt32
);
61 _typeCodesToType
[(int)BinaryTypeCode
.UInt64
] = typeof (UInt64
);
62 _typeCodesToType
[(int)BinaryTypeCode
.Null
] = null;
63 _typeCodesToType
[(int)BinaryTypeCode
.String
] = typeof (string);
65 _typeCodeMap
= new byte[30];
66 _typeCodeMap
[(int)TypeCode
.Boolean
] = (byte) BinaryTypeCode
.Boolean
;
67 _typeCodeMap
[(int)TypeCode
.Byte
] = (byte) BinaryTypeCode
.Byte
;
68 _typeCodeMap
[(int)TypeCode
.Char
] = (byte) BinaryTypeCode
.Char
;
69 _typeCodeMap
[(int)TypeCode
.DateTime
] = (byte) BinaryTypeCode
.DateTime
;
70 _typeCodeMap
[(int)TypeCode
.Decimal
] = (byte) BinaryTypeCode
.Decimal
;
71 _typeCodeMap
[(int)TypeCode
.Double
] = (byte) BinaryTypeCode
.Double
;
72 _typeCodeMap
[(int)TypeCode
.Int16
] = (byte) BinaryTypeCode
.Int16
;
73 _typeCodeMap
[(int)TypeCode
.Int32
] = (byte) BinaryTypeCode
.Int32
;
74 _typeCodeMap
[(int)TypeCode
.Int64
] = (byte) BinaryTypeCode
.Int64
;
75 _typeCodeMap
[(int)TypeCode
.SByte
] = (byte) BinaryTypeCode
.SByte
;
76 _typeCodeMap
[(int)TypeCode
.Single
] = (byte) BinaryTypeCode
.Single
;
77 _typeCodeMap
[(int)TypeCode
.UInt16
] = (byte) BinaryTypeCode
.UInt16
;
78 _typeCodeMap
[(int)TypeCode
.UInt32
] = (byte) BinaryTypeCode
.UInt32
;
79 _typeCodeMap
[(int)TypeCode
.UInt64
] = (byte) BinaryTypeCode
.UInt64
;
80 _typeCodeMap
[(int)TypeCode
.String
] = (byte) BinaryTypeCode
.String
;
82 // TimeStamp does not have a TypeCode, so it is managed as a special
83 // case in GetTypeCode()
85 // This environment variable is only for test and benchmarking purposes.
86 // By default, mono will always use IL generated class serializers.
87 string s
= Environment
.GetEnvironmentVariable("MONO_REFLECTION_SERIALIZER");
88 if (s
== null) s
= "no";
89 UseReflectionSerialization
= (s
!= "no");
93 public static bool IsPrimitive (Type type
)
95 return (type
.IsPrimitive
&& type
!= typeof (IntPtr
)) ||
96 type
== typeof (DateTime
) ||
97 type
== typeof (TimeSpan
) ||
98 type
== typeof (Decimal
);
101 public static byte GetTypeCode (Type type
)
103 if (type
== typeof(TimeSpan
)) return (byte) BinaryTypeCode
.TimeSpan
;
104 else return _typeCodeMap
[(int)Type
.GetTypeCode(type
)];
107 public static Type
GetTypeFromCode (int code
)
109 return _typeCodesToType
[code
];
112 public static void CheckSerializable (Type type
, ISurrogateSelector selector
, StreamingContext context
)
114 if (!type
.IsSerializable
&& !type
.IsInterface
)
116 if (selector
!= null && selector
.GetSurrogate (type
, context
, out selector
) != null)
119 throw new SerializationException ("Type " + type
+ " is not marked as Serializable.");
123 public static void SwapBytes (byte[] byteArray
, int size
, int dataSize
)
127 for (int n
=0; n
<size
; n
+=8) {
128 b
= byteArray
[n
]; byteArray
[n
] = byteArray
[n
+ 7]; byteArray
[n
+ 7] = b
;
129 b
= byteArray
[n
+1]; byteArray
[n
+1] = byteArray
[n
+ 6]; byteArray
[n
+ 6] = b
;
130 b
= byteArray
[n
+2]; byteArray
[n
+2] = byteArray
[n
+ 5]; byteArray
[n
+ 5] = b
;
131 b
= byteArray
[n
+3]; byteArray
[n
+3] = byteArray
[n
+ 4]; byteArray
[n
+ 4] = b
;
133 } else if (dataSize
== 4) {
134 for (int n
=0; n
<size
; n
+=4) {
135 b
= byteArray
[n
]; byteArray
[n
] = byteArray
[n
+ 3]; byteArray
[n
+ 3] = b
;
136 b
= byteArray
[n
+1]; byteArray
[n
+1] = byteArray
[n
+ 2]; byteArray
[n
+ 2] = b
;
138 } else if (dataSize
== 2) {
139 for (int n
=0; n
<size
; n
+=2) {
140 b
= byteArray
[n
]; byteArray
[n
] = byteArray
[n
+ 1]; byteArray
[n
+ 1] = b
;
146 internal enum BinaryElement
: byte
150 UntypedRuntimeObject
= 2,
151 UntypedExternalObject
= 3,
156 BoxedPrimitiveTypeValue
= 8,
163 ArrayOfPrimitiveType
= 15,
173 internal enum TypeTag
: byte
182 ArrayOfPrimitiveType
= 7
185 internal enum ArrayStructure
: byte
187 SingleDimensional
= 0,
192 internal enum MethodFlags
195 PrimitiveArguments
= 2,
196 ArgumentsInSimpleArray
= 4,
197 ArgumentsInMultiArray
= 8,
198 ExcludeLogicalCallContext
= 16,
199 IncludesLogicalCallContext
= 64,
200 IncludesSignature
= 128,
204 GenericArguments
= 0x8000,
205 NeedsInfoArrayMask
= 4 + 8 + 64 + 128 + 0x8000,
208 internal enum ReturnTypeTag
: byte
216 enum BinaryTypeCode
: byte