disable broken tests on net_4_0
[mcs.git] / class / corlib / System.Runtime.Serialization.Formatters.Binary / BinaryCommon.cs
blobffe5b4320df8081c106ae61ecf9458606173de92
1 // BinaryCommon.cs
2 //
3 // Author:
4 // Lluis Sanchez Gual (lluis@ideary.com)
5 //
6 // (C) 2003 Lluis Sanchez Gual
8 //
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:
18 //
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 //
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.
31 using System;
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;
44 static BinaryCommon()
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()
84 #if !MOONLIGHT
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");
90 #endif
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)
117 return;
119 throw new SerializationException ("Type " + type + " is not marked as Serializable.");
123 public static void SwapBytes (byte[] byteArray, int size, int dataSize)
125 byte b;
126 if (dataSize == 8) {
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
148 Header = 0,
149 RefTypeObject = 1,
150 UntypedRuntimeObject = 2,
151 UntypedExternalObject = 3,
152 RuntimeObject = 4,
153 ExternalObject = 5,
154 String = 6,
155 GenericArray = 7,
156 BoxedPrimitiveTypeValue = 8,
157 ObjectReference = 9,
158 NullValue = 10,
159 End = 11,
160 Assembly = 12,
161 ArrayFiller8b = 13,
162 ArrayFiller32b = 14,
163 ArrayOfPrimitiveType = 15,
164 ArrayOfObject = 16,
165 ArrayOfString = 17,
166 Method = 18,
167 _Unknown4 = 19,
168 _Unknown5 = 20,
169 MethodCall = 21,
170 MethodResponse = 22
173 internal enum TypeTag : byte
175 PrimitiveType = 0,
176 String = 1,
177 ObjectType = 2,
178 RuntimeType = 3,
179 GenericType = 4,
180 ArrayOfObject = 5,
181 ArrayOfString = 6,
182 ArrayOfPrimitiveType = 7
185 internal enum ArrayStructure : byte
187 SingleDimensional = 0,
188 Jagged = 1,
189 MultiDimensional = 2
192 internal enum MethodFlags
194 NoArguments = 1,
195 PrimitiveArguments = 2,
196 ArgumentsInSimpleArray = 4,
197 ArgumentsInMultiArray = 8,
198 ExcludeLogicalCallContext = 16,
199 IncludesLogicalCallContext = 64,
200 IncludesSignature = 128,
202 FormatMask = 15,
204 GenericArguments = 0x8000,
205 NeedsInfoArrayMask = 4 + 8 + 64 + 128 + 0x8000,
208 internal enum ReturnTypeTag : byte
210 Null = 2,
211 PrimitiveType = 8,
212 ObjectType = 16,
213 Exception = 32
216 enum BinaryTypeCode : byte
218 Boolean = 1,
219 Byte = 2,
220 Char = 3,
221 Decimal = 5,
222 Double = 6,
223 Int16 = 7,
224 Int32 = 8,
225 Int64 = 9,
226 SByte = 10,
227 Single = 11,
228 TimeSpan = 12,
229 DateTime = 13,
230 UInt16 = 14,
231 UInt32 = 15,
232 UInt64 = 16,
233 Null = 17,
234 String = 18