2016年1月7日 星期四

Class serialization between smartfox and unity / smartfox 類別序列化教學

Smartfox 要使用class serialization,有幾個項目要做。

1 server/client雙邊都要有這個class,且package相同。
2 java class要實作com.smartfoxserver.v2.protocol.serialization.SerializableSFSType。
3 java class單獨編譯成jar,放到extensions\__lib__\。
4 unity c# class要實作Sfs2X.Protocol.Serialization。
5 unity c#要using Sfs2X.Protocol.Serialization
及System.Reflection
且呼叫 DefaultSFSDataSerializer.RunningAssembly = Assembly.GetExecutingAssembly();

現在來看看它的用法。

Server Side

首先我們定義一個要序列化的類別,
這個類別要實作SerializableSFSType。
Class編譯成jar,放到extensions\__lib__\。

package com.sample.model;

import com.smartfoxserver.v2.protocol.serialization.SerializableSFSType;

public class SampleClass implements SerializableSFSType {

    public String id="id_from_server";
    public int hitPoints=10;
    public int count = 10;
     
    public SampleClass()
    {
 
    }
}

把這個類別傳給client端的時候,使用class類型。

SampleClass sc=new SampleClass();
ISFSObject resObj=SFSObject.newInstance();
resObj.putClass("sc", sc);
send("cmd",resObj, user);

Client Side

Client也需要一個相同的class,
client的class package需和java class相同。
client class要實作Serialization。

using Sfs2X.Protocol.Serialization;
using com.smartfoxserver.v2.protocol.serialization.SerializableSFSType;
namespace example{
    public class SampleClass : SerializableSFSType {

        public string id="cid";
        public int hitPoints=0;
        public int count = 0;
    }
}

Client接收server傳來的class時需要呼叫DefaultSFSDataSerializer,

DefaultSFSDataSerializer.RunningAssembly = Assembly.GetExecutingAssembly();
這行通常可放在new SmartfoxServer之後,
要確保SFSDataSerializer可見到需要處理的class。

using Sfs2X.Protocol.Serialization;
using System.Reflection;
DefaultSFSDataSerializer.RunningAssembly = Assembly.GetExecutingAssembly();
//other code....
private  void OnExtensionResponse (BaseEvent evt)
{
    ISFSObject obj = (SFSObject)evt.Params ["params"];
    SampleClass sc=(SampleClass)obj.GetClass("sc");
    String id=sc.id;   //get field
}

沒有留言:

張貼留言