質問編集履歴

5

クラス→構造体

2020/05/08 10:01

投稿

daiki002
daiki002

スコア68

test CHANGED
@@ -1 +1 @@
1
- byte配列をクラスに変換したい
1
+ byte配列を構造体に変換したい
test CHANGED
@@ -182,7 +182,7 @@
182
182
 
183
183
  {
184
184
 
185
- // 1バイト目でクラスを判定する
185
+ // 1バイト目で構造体を判定する
186
186
 
187
187
  var attribute = (IdAttribute)x.GetType().GetCustomAttribute(typeof(IdAttribute));
188
188
 
@@ -190,7 +190,7 @@
190
190
 
191
191
  {
192
192
 
193
- // クラスが判定出来たのでデータ部分を変換する
193
+ // 構造体が判定出来たのでデータ部分を変換する
194
194
 
195
195
  var product = GetProductDetail<typeof(x)>(bytes);
196
196
 
@@ -210,7 +210,7 @@
210
210
 
211
211
 
212
212
 
213
- // 一致するクラスがなかった
213
+ // 一致する構造体がなかった
214
214
 
215
215
  return default;
216
216
 

4

「属性を使わない場合」を追記

2020/05/08 10:01

投稿

daiki002
daiki002

スコア68

test CHANGED
File without changes
test CHANGED
@@ -234,8 +234,92 @@
234
234
 
235
235
  }
236
236
 
237
-
238
-
239
-
240
-
241
237
  ```
238
+
239
+
240
+
241
+ # 属性を使わない場合
242
+
243
+ ```C#
244
+
245
+ using System;
246
+
247
+ using System.Runtime.InteropServices;
248
+
249
+
250
+
251
+ namespace InterfaceTest
252
+
253
+ {
254
+
255
+ interface IProduct { }
256
+
257
+
258
+
259
+ struct AProduct : IProduct { }
260
+
261
+ struct BProduct : IProduct { }
262
+
263
+ struct CProduct : IProduct { }
264
+
265
+
266
+
267
+ class Program
268
+
269
+ {
270
+
271
+ /// <summary>
272
+
273
+ /// byte[] を class に変換する
274
+
275
+ /// </summary>
276
+
277
+ static T GetProductDetail<T>(byte[] bytes)
278
+
279
+ {
280
+
281
+ var length = Marshal.SizeOf(typeof(T));
282
+
283
+ var ptr = Marshal.AllocHGlobal(bytes.Length);
284
+
285
+ Marshal.Copy(bytes, 0, ptr, length);
286
+
287
+ return (T)Marshal.PtrToStructure(ptr, typeof(T));
288
+
289
+ }
290
+
291
+
292
+
293
+ static void Main(string[] args)
294
+
295
+ {
296
+
297
+ var bytes = new byte[] { 0x00, 0x01, 0x02 };
298
+
299
+
300
+
301
+ var product = bytes[0] switch
302
+
303
+ {
304
+
305
+ 0 => (IProduct)GetProductDetail<AProduct>(bytes),
306
+
307
+ 1 => (IProduct)GetProductDetail<BProduct>(bytes),
308
+
309
+ 2 => (IProduct)GetProductDetail<CProduct>(bytes),
310
+
311
+ _ => default
312
+
313
+ };
314
+
315
+
316
+
317
+ Console.WriteLine(product);
318
+
319
+ }
320
+
321
+ }
322
+
323
+ }
324
+
325
+ ```

3

「やりたいこと」を追記

2020/05/08 02:07

投稿

daiki002
daiki002

スコア68

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,14 @@
1
- # 質問
1
+ # やりたいこと
2
+
2
-
3
+ JSONであればテキストのシリアライズ、デシリアライズです。
4
+
3
- byte配列をクラスに変換するような低レベルプログムを書いています。
5
+ ProtocolBuffersであればバイナリデータシリアイズ、デシリアライズです。
6
+
7
+
8
+
9
+ JSONやProtocolBuffersは型情報がシリアライズされたデータには含まれていませんが、今回はProtocolBuffersに似た形のバイナリデータで1バイト目に型情報が含まれています。
10
+
11
+ なので、1バイト目でデータ型を判定してシリアライズ・デシリアライズするようなものを作ろうとしています。
4
12
 
5
13
 
6
14
 
@@ -18,7 +26,13 @@
18
26
 
19
27
 
20
28
 
29
+
30
+
31
+
32
+
33
+ # 質問内容
34
+
21
- しかし、以下の部分でエラーが出ています。
35
+ 以下の部分でエラーが出ています。
22
36
 
23
37
  どのようにすればこのエラーを解決できますか?
24
38
 

2

修正

2020/05/08 01:58

投稿

daiki002
daiki002

スコア68

test CHANGED
File without changes
test CHANGED
@@ -156,7 +156,9 @@
156
156
 
157
157
  new AProduct(),
158
158
 
159
- new BProduct()
159
+ new BProduct(),
160
+
161
+ new CProduct()
160
162
 
161
163
  };
162
164
 

1

修正

2020/05/08 01:42

投稿

daiki002
daiki002

スコア68

test CHANGED
File without changes
test CHANGED
@@ -170,7 +170,7 @@
170
170
 
171
171
  var attribute = (IdAttribute)x.GetType().GetCustomAttribute(typeof(IdAttribute));
172
172
 
173
- if (attribute?.Id == bytes[0])
173
+ if (attribute.Id == bytes[0])
174
174
 
175
175
  {
176
176