annotate Main/jungle-main/persistent/msgpack/src/CompiledPacker.cs @ 20:1f99e150f336

fix folder and add Object Mapper.
author Kazuma Takeda
date Thu, 15 Dec 2016 22:52:48 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
1 //
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
2 // Copyright 2011 Kazuki Oikawa
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
3 //
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
4 // Licensed under the Apache License, Version 2.0 (the "License");
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
5 // you may not use this file except in compliance with the License.
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
6 // You may obtain a copy of the License at
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
7 //
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
8 // http://www.apache.org/licenses/LICENSE-2.0
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
9 //
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
10 // Unless required by applicable law or agreed to in writing, software
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
11 // distributed under the License is distributed on an "AS IS" BASIS,
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
13 // See the License for the specific language governing permissions and
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
14 // limitations under the License.
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
15 //
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
16
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
17 using System;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
18 using System.Collections.Generic;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
19 using System.IO;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
20 using System.Reflection;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
21 using System.Reflection.Emit;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
22 using System.Threading;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
23 using MsgPack.Compiler;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
24
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
25 namespace MsgPack
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
26 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
27 public class CompiledPacker
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
28 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
29 static PackerBase _publicFieldPacker, _allFieldPacker;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
30 PackerBase _packer;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
31
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
32 static CompiledPacker ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
33 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
34 _publicFieldPacker = new MethodBuilderPacker ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
35 _allFieldPacker = new DynamicMethodPacker ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
36 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
37
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
38 public CompiledPacker () : this (false) {}
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
39 public CompiledPacker (bool packPrivateField)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
40 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
41 _packer = (packPrivateField ? _allFieldPacker : _publicFieldPacker);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
42 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
43
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
44 public void Prepare<T> ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
45 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
46 _packer.CreatePacker<T> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
47 _packer.CreateUnpacker<T> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
48 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
49
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
50 #region Generics Pack/Unpack Methods
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
51 public byte[] Pack<T> (T o)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
52 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
53 using (MemoryStream ms = new MemoryStream ()) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
54 Pack<T> (ms, o);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
55 return ms.ToArray ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
56 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
57 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
58
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
59 public void Pack<T> (Stream strm, T o)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
60 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
61 _packer.CreatePacker<T> () (new MsgPackWriter (strm), o);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
62 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
63
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
64 public T Unpack<T> (byte[] buf)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
65 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
66 return Unpack<T> (buf, 0, buf.Length);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
67 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
68
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
69 public T Unpack<T> (byte[] buf, int offset, int size)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
70 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
71 using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
72 return Unpack<T> (ms);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
73 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
74 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
75
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
76 public T Unpack<T> (Stream strm)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
77 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
78 return _packer.CreateUnpacker<T> () (new MsgPackReader (strm));
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
79 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
80 #endregion
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
81
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
82 #region Non-generics Pack/Unpack Methods
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
83 public byte[] Pack (object o)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
84 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
85 using (MemoryStream ms = new MemoryStream ()) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
86 Pack (ms, o);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
87 return ms.ToArray ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
88 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
89 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
90
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
91 public void Pack (Stream strm, object o)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
92 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
93 throw new NotImplementedException ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
94 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
95
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
96 public object Unpack (Type t, byte[] buf)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
97 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
98 return Unpack (t, buf, 0, buf.Length);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
99 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
100
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
101 public object Unpack (Type t, byte[] buf, int offset, int size)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
102 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
103 using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
104 return Unpack (t, ms);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
105 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
106 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
107
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
108 public object Unpack (Type t, Stream strm)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
109 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
110 throw new NotImplementedException ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
111 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
112 #endregion
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
113
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
114 #region Compiled Packer Implementations
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
115 public abstract class PackerBase
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
116 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
117 Dictionary<Type, Delegate> _packers = new Dictionary<Type, Delegate> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
118 Dictionary<Type, Delegate> _unpackers = new Dictionary<Type, Delegate> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
119
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
120 protected Dictionary<Type, MethodInfo> _packMethods = new Dictionary<Type, MethodInfo> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
121 protected Dictionary<Type, MethodInfo> _unpackMethods = new Dictionary<Type, MethodInfo> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
122
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
123 protected PackerBase ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
124 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
125 DefaultPackMethods.Register (_packMethods, _unpackMethods);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
126 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
127
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
128 public Action<MsgPackWriter, T> CreatePacker<T> ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
129 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
130 Delegate d;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
131 lock (_packers) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
132 if (!_packers.TryGetValue (typeof (T), out d)) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
133 d = CreatePacker_Internal<T> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
134 _packers.Add (typeof (T), d);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
135 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
136 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
137 return (Action<MsgPackWriter, T>)d;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
138 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
139
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
140 public Func<MsgPackReader, T> CreateUnpacker<T> ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
141 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
142 Delegate d;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
143 lock (_unpackers) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
144 if (!_unpackers.TryGetValue (typeof (T), out d)) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
145 d = CreateUnpacker_Internal<T> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
146 _unpackers.Add (typeof (T), d);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
147 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
148 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
149 return (Func<MsgPackReader, T>)d;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
150 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
151
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
152 protected abstract Action<MsgPackWriter, T> CreatePacker_Internal<T> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
153 protected abstract Func<MsgPackReader, T> CreateUnpacker_Internal<T> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
154 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
155 public sealed class DynamicMethodPacker : PackerBase
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
156 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
157 private static MethodInfo LookupMemberMappingMethod;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
158 static Dictionary<Type, IDictionary<string, int>> UnpackMemberMappings;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
159
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
160 static DynamicMethodPacker ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
161 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
162 UnpackMemberMappings = new Dictionary<Type, IDictionary<string, int>> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
163 LookupMemberMappingMethod = typeof (DynamicMethodPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
164 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
165
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
166 public DynamicMethodPacker () : base ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
167 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
168 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
169
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
170 protected override Action<MsgPackWriter, T> CreatePacker_Internal<T> ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
171 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
172 DynamicMethod dm = CreatePacker (typeof (T), CreatePackDynamicMethod (typeof (T)));
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
173 return (Action<MsgPackWriter, T>)dm.CreateDelegate (typeof (Action<MsgPackWriter, T>));
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
174 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
175
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
176 protected override Func<MsgPackReader, T> CreateUnpacker_Internal<T> ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
177 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
178 DynamicMethod dm = CreateUnpacker (typeof (T), CreateUnpackDynamicMethod (typeof (T)));
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
179 return (Func<MsgPackReader, T>)dm.CreateDelegate (typeof (Func<MsgPackReader, T>));
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
180 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
181
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
182 DynamicMethod CreatePacker (Type t, DynamicMethod dm)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
183 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
184 ILGenerator il = dm.GetILGenerator ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
185 _packMethods.Add (t, dm);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
186 PackILGenerator.EmitPackCode (t, dm, il, LookupMembers, FormatMemberName, LookupPackMethod);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
187 return dm;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
188 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
189
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
190 DynamicMethod CreateUnpacker (Type t, DynamicMethod dm)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
191 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
192 ILGenerator il = dm.GetILGenerator ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
193 _unpackMethods.Add (t, dm);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
194 PackILGenerator.EmitUnpackCode (t, dm, il, LookupMembers, FormatMemberName, LookupUnpackMethod,
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
195 LookupMemberMapping, LookupMemberMappingMethod);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
196 return dm;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
197 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
198
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
199 static DynamicMethod CreatePackDynamicMethod (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
200 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
201 return CreateDynamicMethod (typeof (void), new Type[] {typeof (MsgPackWriter), t});
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
202 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
203
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
204 static DynamicMethod CreateUnpackDynamicMethod (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
205 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
206 return CreateDynamicMethod (t, new Type[] {typeof (MsgPackReader)});
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
207 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
208
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
209 static MemberInfo[] LookupMembers (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
210 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
211 BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
212 System.Collections.Generic.List<MemberInfo> list = new System.Collections.Generic.List<MemberInfo> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
213 list.AddRange (t.GetFields (baseFlags));
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
214 // TODO: Add NonSerialized Attribute Filter ?
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
215 return list.ToArray ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
216 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
217
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
218 MethodInfo LookupPackMethod (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
219 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
220 MethodInfo mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
221 DynamicMethod dm;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
222 if (_packMethods.TryGetValue (t, out mi))
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
223 return mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
224 dm = CreatePackDynamicMethod (t);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
225 return CreatePacker (t, dm);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
226 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
227
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
228 MethodInfo LookupUnpackMethod (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
229 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
230 MethodInfo mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
231 if (_unpackMethods.TryGetValue (t, out mi))
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
232 return mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
233 DynamicMethod dm = CreateUnpackDynamicMethod (t);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
234 return CreateUnpacker (t, dm);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
235 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
236
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
237 static string FormatMemberName (MemberInfo m)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
238 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
239 if (m.MemberType != MemberTypes.Field)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
240 return m.Name;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
241
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
242 int pos;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
243 string name = m.Name;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
244 if (name[0] == '<' && (pos = name.IndexOf ('>')) > 1)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
245 name = name.Substring (1, pos - 1); // Auto-Property (\<.+\>) <ab>
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
246 return name;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
247 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
248
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
249 static int _dynamicMethodIdx = 0;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
250 static DynamicMethod CreateDynamicMethod (Type returnType, Type[] parameterTypes)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
251 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
252 string name = "_" + Interlocked.Increment (ref _dynamicMethodIdx).ToString ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
253 return new DynamicMethod (name, returnType, parameterTypes, true);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
254 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
255
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
256 internal static IDictionary<string,int> LookupMemberMapping (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
257 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
258 IDictionary<string, int> mapping;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
259 lock (UnpackMemberMappings) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
260 if (!UnpackMemberMappings.TryGetValue (t, out mapping)) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
261 mapping = new Dictionary<string, int> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
262 UnpackMemberMappings.Add (t, mapping);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
263 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
264 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
265 return mapping;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
266 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
267 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
268 public sealed class MethodBuilderPacker : PackerBase
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
269 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
270 public const string AssemblyName = "MessagePackInternalAssembly";
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
271 static AssemblyName DynamicAsmName;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
272 static AssemblyBuilder DynamicAsmBuilder;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
273 static ModuleBuilder DynamicModuleBuilder;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
274
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
275 private static MethodInfo LookupMemberMappingMethod;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
276 static Dictionary<Type, IDictionary<string, int>> UnpackMemberMappings;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
277
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
278 static MethodBuilderPacker ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
279 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
280 UnpackMemberMappings = new Dictionary<Type, IDictionary<string, int>> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
281 LookupMemberMappingMethod = typeof (MethodBuilderPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
282
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
283 DynamicAsmName = new AssemblyName (AssemblyName);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
284 DynamicAsmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly (DynamicAsmName, AssemblyBuilderAccess.Run);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
285 DynamicModuleBuilder = DynamicAsmBuilder.DefineDynamicModule (DynamicAsmName.Name);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
286 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
287
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
288 public MethodBuilderPacker () : base ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
289 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
290 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
291
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
292 protected override Action<MsgPackWriter, T> CreatePacker_Internal<T> ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
293 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
294 TypeBuilder tb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
295 MethodBuilder mb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
296 CreatePackMethodBuilder (typeof (T), out tb, out mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
297 _packMethods.Add (typeof (T), mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
298 CreatePacker (typeof (T), mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
299 MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, true);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
300 return (Action<MsgPackWriter, T>)Delegate.CreateDelegate (typeof (Action<MsgPackWriter, T>), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
301 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
302
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
303 protected override Func<MsgPackReader, T> CreateUnpacker_Internal<T> ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
304 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
305 TypeBuilder tb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
306 MethodBuilder mb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
307 CreateUnpackMethodBuilder (typeof (T), out tb, out mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
308 _unpackMethods.Add (typeof (T), mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
309 CreateUnpacker (typeof (T), mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
310 MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, false);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
311 return (Func<MsgPackReader, T>)Delegate.CreateDelegate (typeof (Func<MsgPackReader, T>), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
312 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
313
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
314 void CreatePacker (Type t, MethodBuilder mb)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
315 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
316 ILGenerator il = mb.GetILGenerator ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
317 PackILGenerator.EmitPackCode (t, mb, il, LookupMembers, FormatMemberName, LookupPackMethod);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
318 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
319
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
320 void CreateUnpacker (Type t, MethodBuilder mb)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
321 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
322 ILGenerator il = mb.GetILGenerator ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
323 PackILGenerator.EmitUnpackCode (t, mb, il, LookupMembers, FormatMemberName, LookupUnpackMethod,
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
324 LookupMemberMapping, LookupMemberMappingMethod);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
325 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
326
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
327 MethodInfo ToCallableMethodInfo (Type t, TypeBuilder tb, bool isPacker)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
328 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
329 Type type = tb.CreateType ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
330 MethodInfo mi = type.GetMethod (isPacker ? "Pack" : "Unpack", BindingFlags.Static | BindingFlags.Public);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
331 if (isPacker) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
332 _packMethods[t] = mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
333 } else {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
334 _unpackMethods[t] = mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
335 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
336 return mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
337 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
338
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
339 MethodInfo LookupPackMethod (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
340 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
341 MethodInfo mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
342 TypeBuilder tb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
343 MethodBuilder mb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
344 if (_packMethods.TryGetValue (t, out mi))
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
345 return mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
346 CreatePackMethodBuilder (t, out tb, out mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
347 _packMethods.Add (t, mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
348 CreatePacker (t, mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
349 return ToCallableMethodInfo (t, tb, true);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
350 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
351
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
352 MethodInfo LookupUnpackMethod (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
353 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
354 MethodInfo mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
355 TypeBuilder tb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
356 MethodBuilder mb;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
357 if (_unpackMethods.TryGetValue (t, out mi))
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
358 return mi;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
359 CreateUnpackMethodBuilder (t, out tb, out mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
360 _unpackMethods.Add (t, mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
361 CreateUnpacker (t, mb);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
362 return ToCallableMethodInfo (t, tb, false);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
363 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
364
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
365 static string FormatMemberName (MemberInfo m)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
366 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
367 return m.Name;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
368 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
369
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
370 static MemberInfo[] LookupMembers (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
371 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
372 BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
373 System.Collections.Generic.List<MemberInfo> list = new System.Collections.Generic.List<MemberInfo> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
374 list.AddRange (t.GetFields (baseFlags));
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
375 // TODO: Add NonSerialized Attribute Filter ?
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
376 return list.ToArray ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
377 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
378
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
379 static void CreatePackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
380 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
381 tb = DynamicModuleBuilder.DefineType (t.Name + "PackerType", TypeAttributes.Public);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
382 mb = tb.DefineMethod ("Pack", MethodAttributes.Static | MethodAttributes.Public, typeof (void), new Type[] {typeof (MsgPackWriter), t});
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
383 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
384
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
385 static void CreateUnpackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
386 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
387 tb = DynamicModuleBuilder.DefineType (t.Name + "UnpackerType", TypeAttributes.Public);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
388 mb = tb.DefineMethod ("Unpack", MethodAttributes.Static | MethodAttributes.Public, t, new Type[] {typeof (MsgPackReader)});
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
389 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
390
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
391 internal static IDictionary<string,int> LookupMemberMapping (Type t)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
392 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
393 IDictionary<string, int> mapping;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
394 lock (UnpackMemberMappings) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
395 if (!UnpackMemberMappings.TryGetValue (t, out mapping)) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
396 mapping = new Dictionary<string, int> ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
397 UnpackMemberMappings.Add (t, mapping);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
398 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
399 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
400 return mapping;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
401 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
402 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
403 #endregion
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
404
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
405 #region default pack/unpack methods
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
406 internal static class DefaultPackMethods
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
407 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
408 public static void Register (Dictionary<Type, MethodInfo> packMethods, Dictionary<Type, MethodInfo> unpackMethods)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
409 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
410 RegisterPackMethods (packMethods);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
411 RegisterUnpackMethods (unpackMethods);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
412 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
413
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
414 #region Pack
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
415 static void RegisterPackMethods (Dictionary<Type, MethodInfo> packMethods)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
416 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
417 Type type = typeof (DefaultPackMethods);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
418 MethodInfo[] methods = type.GetMethods (BindingFlags.Static | BindingFlags.NonPublic);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
419 string methodName = "Pack";
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
420 for (int i = 0; i < methods.Length; i ++) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
421 if (!methodName.Equals (methods[i].Name))
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
422 continue;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
423 ParameterInfo[] parameters = methods[i].GetParameters ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
424 if (parameters.Length != 2 || parameters[0].ParameterType != typeof (MsgPackWriter))
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
425 continue;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
426 packMethods.Add (parameters[1].ParameterType, methods[i]);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
427 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
428 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
429
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
430 internal static void Pack (MsgPackWriter writer, string x)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
431 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
432 if (x == null) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
433 writer.WriteNil ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
434 } else {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
435 writer.Write (x, false);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
436 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
437 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
438 #endregion
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
439
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
440 #region Unpack
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
441 static void RegisterUnpackMethods (Dictionary<Type, MethodInfo> unpackMethods)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
442 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
443 BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
444 Type type = typeof (DefaultPackMethods);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
445 MethodInfo mi = type.GetMethod ("Unpack_Signed", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
446 unpackMethods.Add (typeof (sbyte), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
447 unpackMethods.Add (typeof (short), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
448 unpackMethods.Add (typeof (int), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
449
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
450 mi = type.GetMethod ("Unpack_Signed64", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
451 unpackMethods.Add (typeof (long), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
452
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
453 mi = type.GetMethod ("Unpack_Unsigned", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
454 unpackMethods.Add (typeof (byte), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
455 unpackMethods.Add (typeof (ushort), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
456 unpackMethods.Add (typeof (char), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
457 unpackMethods.Add (typeof (uint), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
458
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
459 mi = type.GetMethod ("Unpack_Unsigned64", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
460 unpackMethods.Add (typeof (ulong), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
461
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
462 mi = type.GetMethod ("Unpack_Boolean", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
463 unpackMethods.Add (typeof (bool), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
464
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
465 mi = type.GetMethod ("Unpack_Float", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
466 unpackMethods.Add (typeof (float), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
467
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
468 mi = type.GetMethod ("Unpack_Double", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
469 unpackMethods.Add (typeof (double), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
470
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
471 mi = type.GetMethod ("Unpack_String", flags);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
472 unpackMethods.Add (typeof (string), mi);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
473 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
474
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
475 internal static int Unpack_Signed (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
476 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
477 if (!reader.Read () || !reader.IsSigned ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
478 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
479 return reader.ValueSigned;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
480 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
481
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
482 internal static long Unpack_Signed64 (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
483 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
484 if (!reader.Read ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
485 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
486 if (reader.IsSigned ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
487 return reader.ValueSigned;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
488 if (reader.IsSigned64 ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
489 return reader.ValueSigned64;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
490 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
491 return 0; // unused
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
492 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
493
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
494 internal static uint Unpack_Unsigned (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
495 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
496 if (!reader.Read () || !reader.IsUnsigned ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
497 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
498 return reader.ValueUnsigned;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
499 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
500
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
501 internal static ulong Unpack_Unsigned64 (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
502 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
503 if (!reader.Read ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
504 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
505 if (reader.IsUnsigned ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
506 return reader.ValueUnsigned;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
507 if (reader.IsUnsigned64 ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
508 return reader.ValueUnsigned64;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
509 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
510 return 0; // unused
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
511 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
512
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
513 internal static bool Unpack_Boolean (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
514 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
515 if (!reader.Read () || !reader.IsBoolean ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
516 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
517 return reader.ValueBoolean;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
518 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
519
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
520 internal static float Unpack_Float (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
521 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
522 if (!reader.Read () || reader.Type != TypePrefixes.Float)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
523 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
524 return reader.ValueFloat;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
525 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
526
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
527 internal static double Unpack_Double (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
528 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
529 if (!reader.Read () || reader.Type != TypePrefixes.Double)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
530 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
531 return reader.ValueDouble;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
532 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
533
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
534 internal static string Unpack_String (MsgPackReader reader)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
535 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
536 if (!reader.Read () || !reader.IsRaw ())
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
537 UnpackFailed ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
538 return reader.ReadRawString ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
539 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
540
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
541 internal static void UnpackFailed ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
542 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
543 throw new FormatException ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
544 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
545 #endregion
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
546 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
547 #endregion
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
548 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
549 }