changeset 23:06daf5e1e9de

update Rewriting chapter
author riono <e165729@ie.u-ryukyu.ac.jp>
date Mon, 31 Jan 2022 20:40:00 +0900
parents 7fac2aee6048
children 1323b7d93190
files Paper/chapter/2-RewriteCS.tex Paper/master_paper.pdf Paper/src/cs/MessagePackExample.cs Paper/src/java/MessagePackExample.java
diffstat 4 files changed, 71 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/Paper/chapter/2-RewriteCS.tex	Mon Jan 31 19:40:01 2022 +0900
+++ b/Paper/chapter/2-RewriteCS.tex	Mon Jan 31 20:40:00 2022 +0900
@@ -93,12 +93,35 @@
 \lstinputlisting[label=src:CSAcceptThread, caption=Christie SharpにおけるAcceptThreadの実装の一部]{src/cs/AcceptThread.cs}
 
 ソースコード\ref{src:CSAcceptThread}はソースコード\ref{src:JavaAcceptThread}をC\#に書き換えを行ったものである。
-Christieでは、Socket通信のためにmulti Threadを用意していた。
-
-
+Christieでは、multi ThreadでSocket通信を行っていた。
+Christie SharpではCodeGearの処理で使用していたThreadPoolと同様にTaskへの書き換えを行った。
 
 \section{MessagePackの変更}
+Christieではデータを他Nodeに送信する際に、MessagePackを使用してデータを圧縮し、送信を行っている。
+Chrisiteで使用しているMessagePackはmsgpack java 0.6.12を使用しており、現在はサポートされていない。
+そのためJavaでサポート対象となっているmsgpack java 0.7.x以上のMEssagePakckとは記述方法が異なっている。
+ソースコード\ref{src:JavaMspackExample}はChristieで使用してるmsgpack java 0.6.12の使用例である。
 
+\lstinputlisting[label=src:JavaMspackExample, caption=JavaにおけるMessagePackの使用例]{src/java/MessagePackExample.java}
+
+MessagePackを使用するには、圧縮を行うクラスに対して明示的に@Message annotationを付ける必要がある。
+これにより、クラス内で宣言したpublic変数が圧縮の対象となる。
+ソースコード\ref{src:JavaMspackExample}の14 - 18行目は圧縮解凍を行う例である。
+MessagePackインスタンスを作成後、writeメソッドを使用することで引数に渡したオブジェクトをbyte[]型に圧縮できる。
+解凍にはreadメソッドを使用し、引数として圧縮されたbyte[]型と解凍対象のクラスを渡すことで解凍できる。
+ 
+
+C\#のMessagePackは複数存在しており、msgpack java 0.6.12とほぼ同様の記述方法を採っているMessagePack CSharpを選択した。
+
+\newpage
+
+\lstinputlisting[label=src:CSMspackExample, caption=C\#におけるMessagePackの使用例]{src/cs/MessagePackExample.cs}
+MessagePack CSharpではmsgpack javaと同様にクラスに対して圧縮を行うため、\ref{src:CSMspackExample}の1行目でMessageObject attributeを追加している。
+また、圧縮する変数に対してkeyを設定することができ、indexesとしてのintやstringをkeyとして指定することができる。
+
+データの圧縮にはMessagePackSerializer.Serializeメソッドを使用し、引数として渡したオブジェクトをbyte[]型に圧縮変換する。
+解凍にはMessagePackSerializer.Deserializeメソッドを使用する。Deserializeメソッドはジェネリスク関数であるため、<>内に解凍対象のクラスを指定する。
+ソースコード\ref{src:CSMspackExample}の22行目ではjson展開の例であり、変数それぞれにkeyを指定していることで展開可能となっている。
 
 \section{送信データの修正}
 
Binary file Paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/cs/MessagePackExample.cs	Mon Jan 31 20:40:00 2022 +0900
@@ -0,0 +1,25 @@
+[MessagePackObject]
+public class MyClass {
+    [Key(0)]
+    public int Age { get; set; }
+    [Key(1)]
+    public string FirstName { get; set; }
+    [Key(2)]
+    public string LastName { get; set; }
+
+    static void Main(string[] args) {
+        var mc = new MyClass {
+            Age = 99,
+            FirstName = "hoge",
+            LastName = "huga",
+        };
+
+        // Call Serialize/Deserialize, that's all.
+        byte[] bytes = MessagePackSerializer.Serialize(mc);
+        MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes);
+
+        // [99,"hoge","huga"]
+        var json = MessagePackSerializer.ConvertToJson(bytes);
+        Console.WriteLine(json);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/java/MessagePackExample.java	Mon Jan 31 20:40:00 2022 +0900
@@ -0,0 +1,20 @@
+public class MessagePackExample {
+    @Message // Annotation
+    public static class MyMessage {
+        // public fields are serialized.
+        public String name;
+        public double version;
+    }
+
+    public static void main(String[] args) throws Exception {
+        MyMessage src = new MyMessage();
+        src.name = "msgpack";
+        src.version = 0.6;
+
+        MessagePack msgpack = new MessagePack();
+        // Serialize
+        byte[] bytes = msgpack.write(src);
+        // Deserialize
+        MyMessage dst = msgpack.read(bytes, MyMessage.class);
+    }
+}
\ No newline at end of file