Mercurial > hg > Papers > 2022 > riono-master
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{送信データの修正}
--- /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