xljiulang/NetworkSocket

建议支持uwp和可移植类库

yuaom opened this issue · 6 comments

yuaom commented

刚试了下 修改不大 主要是反射部分

虽然感觉不多,但也没有好办法,反射部分与Type和Attribute相关的API在uwp上是缺失的,只有TcpServerBase这层移植工作量少。
我是觉得,Networksocket更多是作服务端,所以就像移不到uwp,影响不大。其实整个工程不改一行代码就可以在MONO上编译,这个可以提供另一种移植方案。

yuaom commented

@xljiulang 反射的Type和Attribute部分并没有缺少
type部是把方法转移到了Type.GetTypeInfo() 的TypeInfo中
Attributes 是改成了方法 GetCustomAttributes
我已经将NetworkSocket成功移植到uwp和.net core中了,移植最大的麻烦是json系列化部分,需要更换成Newtonsoft.Json

感谢提醒,.net core我没用过,所以不知道有这些转移,还没有翻过.net core代码。
NetworkSocket.Fast.DefaultSerializer、NetworkSocket.WebSocket.Fast.DefaultJsonSerializer和NetworkSocket.WebSocket.Fast.JObject三个internal对象都依赖于System.Web.Script.Serialization.JavaScriptSerializer,前两个好替换,JObject比较棘手,但使用json.net实现应该也不是非常难。
还有一些URL编解码,目前是依赖system.web.dll

@loqix
现在从JObject分离出一个Converter类,自带的JObject可以使用json.net的JObject替代,FastWebSocketCommon里几处调用到的Converter.Cast方法,可以采用new Converter(new jsonNetConvert()).Convert()来替代,以支持json.net的JToken类型转换为Api参数的数据类型。
此处要只需要实现jsonNetConvert这个转换单元:
class jsonNetConvert : IConvert
{
public bool Convert(Converter converter, object value, Type targetType, out object result)
{
var jToken = value as Newtonsoft.Json.Linq.JToken;
if (jToken == null)
{
result = null;
return false;
}
result = jToken.ToObject(targetType);
return true;
}
}

@loqix
再次提交了一个更新,把json序列化、动态序列化和类型转换都定义在IJsonSerializer接口里了,自带的JObject变成了NetworkSocket.WebSocket.Fast.DefaultJsonSerializer动态反序列化的实现。
现在要移植的话,直接删除NetworkSocket.WebSocket.Fast.DefaultJsonSerializer这个类,使用示例里的Demo\WebSocket\JsonNetSerializer这个类替换就可以了,JsonNetSerializer是由Json.net实现的。
此下,组件里所有的默认序列化类,都可以很方便的从JavaScriptSerializer替换为Json.net实现。

yuaom commented

thx.