記事を書いたきっかけ
intやfloat、bool、Vector3の値をシリアライズしてデシリアライズできる処理を実装しようと思って行きついたのが、このToString()。やってることの説明としてはintやfloatの値を文字列として外部に出力して、デシリアライズする際にその値の型で文字列から値に変換している。
実際のコード
下記ではVector3NodeっていうクラスでVector3の値をシリアライズ、デシリアライズしている。
Vector3Node.cs
publicclassVector3Node:PropertyNode{privateVector3Fieldvec3Field;publicVector3Value{get{returnvec3Field.value;}set{vec3Field.value=value;}}publicVector3Node():base(){CreateOutputPort<Vector3>(Port.Capacity.Multi,"Vector3");vec3Field=newVector3Field();mainContainer.Add(vec3Field);}publicoverridestringSerializeProperty(){returnValue.ToString();}publicoverridevoidDeserializeProperty(string_propertyValue){varelements=_propertyValue.Trim('(',')').Split(',');if(elements.Length<=3){varvec=Vector3.zero;vec.x=float.Parse(elements[0]);vec.y=float.Parse(elements[1]);vec.z=float.Parse(elements[2]);Value=vec;}}}
シリアライズ用の関数でVector3の数値を文字列で返し、デシリアライズの際に渡された文字列を3つに分解してVector3の各メンバに代入して処理させています。
BaseNodeクラスの方でデシリアライズ用の関数を抽象メソッドとして定義して、各クラスでオーバーライドしています。
こうすることで型ごとのクラスで型を意識することなく、文字列でデータの読み書きができるようになります。
後はこのVector3用のParseの処理を拡張メソッドとしてリファクタリングすれば汎用性が出そうですね。
参考サイト
文字列から数値、数値から文字列への変換
https://dobon.net/vb/dotnet/programing/convert.html
Vector3の文字列から値へのの変換の方法
https://teratail.com/questions/109274