Giter Site home page Giter Site logo

jasonxudeveloper / nino Goto Github PK

View Code? Open in Web Editor NEW
409.0 11.0 41.0 3.34 MB

Definite useful and high performance modules for C# projects, especially for Unity. 实用的高性能C#模块,尤其在Unity平台能带来令人难以置信的效益。

License: MIT License

C# 100.00%

nino's Introduction

Nino

Definite useful and high performance modules for C# projects, especially for Unity.

实用的高性能C#模块,尤其在Unity平台能带来令人难以置信的效益。

buildlicense

功能列表

  • 共享模块 nino.shared.nuget

    • IO
      • 高性能数据压缩流
      • 数组对象池(线程安全)
      • 基础对象池(线程安全)
      • 二进制流对象池(线程安全)
      • 可动态修改Buffer流(包含不需要分配io_buffer去read/write的方法)
      • 高性能动态扩容Buffer(易用、高效,低GC)性能报告 使用教程
    • Collections
      • 无检查List
      • 无检查Stack
    • Mgr
      • 压缩解压助手
    • Util
      • HashCode计算工具
  • 序列化模块,使用教程 nino.serialization.nuget

    Protobuf-net/MsgPack/BinaryFormatter/Bson/JSON等序列化库的平替方案,优势是更小体积,更高性能,支持多线程,支持多态

    注意,该模块的序列化数据,仅支持在C#平台使用该库进行序列化和反序列化,无法跨语言使用

    Nino.Serialization v1.2.0与其前面所有版本不兼容,详细请查看使用教程

    Nino.Serialization v1.1.2与其前面所有版本不兼容,详细请查看使用教程

    Nino.Serialization v1.1.0与其前面所有版本不兼容,详细请查看使用教程

    Nino.Serialization v1.0.21.2与其前面所有版本不兼容,详细请查看使用教程

    • 测试案例

      • Test1 Nino VS Protobuf-net 序列化

      • Test2 Nino VS BinaryFormatter 序列化

      • Test3 Nino VS Protobuf-net 反序列化

      • Test4 Nino VS BinaryFormatter 反序列化

      • Test5 Nino VS MongoDB.Bson 序列化以及反序列化

      • Test6 Nino VS MsgPack 序列化以及反序列化

      • Test7 自定义Nino序列化反序列化委托

      • Test8 自动收集全部字段进行序列化/反序列化(无需给单个字段或属性打标签)

      • Test9 基础类型序列化反序列化

      • Test10 复杂结构类型序列化反序列化

      • Test11 ILRuntime测试(需要搭配使用教程启用ILRuntime)

      • 真机测试 可以打IL2CPP或Mono包进行测试(对比了Nino Reflection/Code Gen与Protobuf-net/BinaryFormatter/Bson/MsgPack Code Gen的序列化性能、序列化体积、反序列化性能)

        Protobuf-net与Bson在IL2CPP下暂不支持字典序列化

        MsgPack在IL2CPP下不生成代码无法使用

    • 性能报告

目录结构

  • Docs,文档
  • src,Nino源码
  • Nino_Unity,Nino Unity 2019及以上版本的工程,包含源码和测试代码
  • Performance,性能报告

在Unity平台使用

有两种方法:

  • 直接下载本工程,并用Unity打开Nino目录进行开发

  • Nino_Unity/Assets/Nino复制到自己的Unity项目即可,如果不需要测试案例的话,可以不包含Nino/Nino/Assets/Nino/Test

    如果需要运行测试案例,记得也需要复制Nino_Unity/Asset/ThirdParty到Unity项目

在非Unity平台使用

  • 使用NuGet

    NuGet里搜Nino就好,目前有Nino.SharedNino.Serialization

    PM> Install-Package Nino.Shared -Version 1.0.15
    PM> Install-Package Nino.Serialization -Version 1.2.2
  • 使用src下的代码(复制进自己项目即可)

nino's People

Contributors

dependabot[bot] avatar gmoonwalk avatar jasonxudeveloper avatar veloctor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nino's Issues

序列化成功后 反序列化失败

using System;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using 协议;
using System.Runtime.Serialization.Formatters.Binary;
class MainClass
{
    public static void Main(string[] args)
    {
        MessagePackage package = new MessagePackage
        {
            agreement = AgreementType.Move,
            move = new Move(1, 2, 3, 4, 5, 6, 7)
        };


        var a = Nino.Serialization.Serializer.Serialize<MessagePackage>(package);
        var b = Nino.Serialization.Deserializer.Deserialize<MessagePackage>(a);
        Console.WriteLine(b.move.x);
    }
}
 public enum AgreementType
    {
        Enter = 1,
        EnemyEnter = 2,
        List = 3,
        Move = 4,
        ReadyCreatEnemy = 5,
        OnGameEnd = 6,
        Attack = 7,
        Hit = 7,
        OnHit = 8,
        ReadyDTDown = 9,
        ReadyDTUp = 10,
        GetTime = 11,
        GetID = 12,
    }
   [NinoSerialize(true)]
    public partial class  MessagePackage
    {
        public AgreementType agreement;
        public Move move;
    }
  [NinoSerialize]
    public partial class Move 
    {
        [NinoMember(1)]
        public int id;
        [NinoMember(2)]
        public float x;
        [NinoMember(3)]
        public float y;
        [NinoMember(4)]
        public float z;
        [NinoMember(5)]
        public float eulerX;
        [NinoMember(6)]
        public float eulerY;
        [NinoMember(7)]
        public float eulerZ;

        public Move(int id,float x,float y,float z,float eulerX,float eulerY,float eulerZ)
        {
            this.id = id;
            this.x = x;
            this.y = y;
            this.z = z;
            this.eulerX = eulerX;
            this.eulerY = eulerY;
            this.eulerX = eulerZ;
        }

    }

热更工程 反序列化失败

主工程:
`using Nino.Serialization;

namespace NinoData.Chat
{
[NinoSerialize]
public partial class SystemData
{
[NinoMember(1)]
public string name;
[NinoMember(2)]
public string notice;
}
}
`

热更工程:
` NinoData.Chat.SystemData systemData=new NinoData.Chat.SystemData() { name="111",notice="222"};
var dt = Nino.Serialization.Serializer.Serialize(systemData);
JEngine.Core.Log.PrintError(BitConverter.ToString(dt));
Nino.Serialization.Deserializer.Deserialize<NinoData.Chat.SystemData> (dt);

        Debug.LogError("热更新"+ systemData.name);`

能输出序列化的byte 反序列化报错:
TargetException: Non-static field requires a target
System.Reflection.RuntimeFieldInfo.SetValue (System.Object obj, System.Object val, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Globalization.CultureInfo culture) (at <1f66344f2f89470293d8b67d71308c07>:0)
System.Reflection.FieldInfo.SetValue (System.Object obj, System.Object value) (at <1f66344f2f89470293d8b67d71308c07>:0)
Nino.Serialization.Deserializer.Deserialize (System.Type type, System.Object val, System.Span1[T] data, Nino.Serialization.Reader reader, Nino.Serialization.CompressOption option, System.Boolean returnDispose) (at Assets/Dependencies/Nino/Serialization/Deserializer.cs:268) Nino.Serialization.Deserializer.Deserialize (System.Type type, System.Byte[] data, Nino.Serialization.CompressOption option) (at Assets/Dependencies/Nino/Serialization/Deserializer.cs:68) Nino.Serialization.ILRuntimeResolver.Deserialize_0 (ILRuntime.Runtime.Intepreter.ILIntepreter intp, ILRuntime.Runtime.Stack.StackObject* esp, System.Collections.Generic.List1[T] mStack, ILRuntime.CLR.Method.CLRMethod method, System.Boolean isNewObj) (at Assets/Dependencies/Nino/Serialization/ILRuntimeResolver.cs:193)
ILRuntime.Runtime.Intepreter.ILIntepreter.Execute (ILRuntime.CLR.Method.ILMethod method, ILRuntime.Runtime.Stack.StackObject* esp, System.Boolean& unhandledException) (at Assets/Dependencies/ILRuntime/ILRuntime/Runtime/Intepreter/ILIntepreter.cs:2087)
Rethrow as ILRuntimeException: Non-static field requires a target
IL_006a: call !!0 Nino.Serialization.Deserializer::Deserialize<NinoData.Chat.SystemData>(System.Byte[],Nino.Serialization.CompressOption)
UI.LoginGame.LoginGame.Start() (at HotUpdateScripts/UI/LoginGame/LoginGame.cs:38)
IL_006a: call !!0 Nino.Serialization.Deserializer::Deserialize<NinoData.Chat.SystemData>(System.Byte[],Nino.Serialization.CompressOption)
UI.LoginGame.LoginGame.Start() (at HotUpdateScripts/UI/LoginGame/LoginGame.cs:38)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
JEngine.Core.Logger:LogException(Exception, Object) (at Assets/Dependencies/JEngine/Core/Logger/LogHandler.cs:201)
UnityEngine.Debug:LogException(Exception)
JEngine.Core.LifeCycleMgr:ExecuteItems(List1, Boolean, Func2) (at Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs:326)
JEngine.Core.LifeCycleMgr:LateUpdate() (at Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs:485)

按F12 查看热更工程的SystemData:
`#region 程序集 Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// F:\MoeMaster\MoeMaster\Library\ScriptAssemblies\Assembly-CSharp.dll
#endregion

using Nino.Serialization;

namespace NinoData.Chat
{
[NinoSerialize(false)]
public class SystemData
{
[NinoMemberAttribute(1)]
public string name;
[NinoMemberAttribute(2)]
public string notice;

    public SystemData();
}

}`

请教

UncheckedList的作用是什么?

v1.2.0 ilruntime报错 无法使用

Assets\Pkg\Nino\Serialization\ILRuntimeResolver.cs(306,34): error CS0115: 'SerializationHelper1ILTypeInstanceAdapter.Adapter.Serialize(ILTypeInstance, Writer)': no suitable method found to override

Assets\Pkg\Nino\Serialization\ILRuntimeResolver.cs(279,22): error CS0534: 'SerializationHelper1ILTypeInstanceAdapter.Adapter' does not implement inherited abstract member 'NinoWrapperBase<ILTypeInstance>.GetSize(ILTypeInstance)'

Assets\Pkg\Nino\Serialization\ILRuntimeResolver.cs(279,22): error CS0534: 'SerializationHelper1ILTypeInstanceAdapter.Adapter' does not implement inherited abstract member 'NinoWrapperBase<ILTypeInstance>.Serialize(ILTypeInstance, ref Writer)'

Nino\Serialization\ILRuntimeResolver.cs 看一下 这个文件

反序列化Int类型错误

[NinoMember(9)] public int LoginAppID = -1;
反序列化代码生成
reader.DecompressAndReadNumber<System.Int32>(ref value.LoginAppID);
值是错误的
用反射正常

Nino.Shared.Mgr.CompressMgr.Decompress 爆内存

static void Main(string[] args)
 {
            var rawData = File.ReadAllBytes("3.map");
            MemoryStream ms = new MemoryStream();
            DeflateStream compressedzipStream = new DeflateStream(ms, CompressionMode.Compress);

            compressedzipStream.Write(rawData, 0, rawData.Length);
            compressedzipStream.Close();
            var Srcdata = ms.ToArray();
            ms.Dispose();
            compressedzipStream.Dispose();


            while (true)
            {
                var decode_data = Nino.Shared.Mgr.CompressMgr.Decompress(Srcdata);
                GC.Collect();
                Thread.Sleep(100);
            }

 }

能不能支持一下多态

想用nino替换掉odin的持久化功能,odin老是丢数据。

比如下面这种数据结构

    [NinoSerialize]
    public class Test0
    {
        [NinoMember(1)] public List<Test1> a = new List<Test1>();
    }
    
    [NinoSerialize]
    public class Test1
    {

    }
    
    [NinoSerialize]
    public class Test2: Test1
    {

    }
        
        {
            Test0 test = new Test0();
            test.a.Add(new Test1());
            test.a.Add(new Test2());
            var bytes = Nino.Serialization.Serializer.Serialize(test);
            
            test = Nino.Serialization.Deserializer.Deserialize<Test0>(bytes);
        }

是否可以支持序列化分组

[NinoSerialize]
public partial class DataTest
{
    [NinoMember(0)] public int a = 0;
    [NinoMember(1)] public int b = 0;
    [NinoMember(2)] public componentA compA;
    [NinoMember(3)] public componentB compB;
}

[NinoSerialize] public partial class componentA { public int aa = 1; }
[NinoSerialize] public partial class componentB { public int bb = 2; }

DataTest test1 = new DataTest();
test1.a = 1;
test1.b = 2;
test1.compA = new();

DataTest test2 = new DataTest();
test1.a = 1;
test1.b = 2;
test1.compB = new();

在member中新增分组ID。 只对应序列化对应分组ID的数据

jengine 热更工程List反序列化问题

[Serializable]
    [NinoSerialize]
    public partial class PlayerLoginState2
    {
        [NinoMember(0)] public List<int> TestService;

        public PlayerLoginState2()
        {
            TestService = new List<int>();
        }
    }

在PlayerLoginState1和PlayerLoginState2一样的定义,PlayerLoginState1放在主工程,PlayerLoginState2放在热更工程;

在主工程调用

            PlayerLoginState1 playerLoginState1 = new PlayerLoginState1();
            playerLoginState1.TestService.Add(0);
            string test1 = Convert.ToBase64String(Nino.Serialization.Serializer.Serialize(playerLoginState1));
            Debug.Log("test1 Serialize OK >" + test1);
            var test2 = Nino.Serialization.Deserializer.Deserialize<PlayerLoginState1>(Convert.FromBase64String(test1));
            Debug.Log("test1 Deserialize OK");

不会出问题。

热更工程调用以下代码:

            PlayerLoginState1 playerLoginState1 = new PlayerLoginState1();
            playerLoginState1.TestService.Add(0);
            string test1 = Convert.ToBase64String(Nino.Serialization.Serializer.Serialize(playerLoginState1));
            Debug.Log("test1 Serialize OK >" + test1);
            var test2 = Nino.Serialization.Deserializer.Deserialize<PlayerLoginState1>(Convert.FromBase64String(test1));
            Debug.Log("test1 Deserialize OK");
//
            PlayerLoginState2 playerLoginState2 = new PlayerLoginState2();
            playerLoginState2.TestService.Add(0);
            string test3 = Convert.ToBase64String(Nino.Serialization.Serializer.Serialize(playerLoginState2));
            Debug.Log("test2 Serialize OK >" + test3);
            var test4 = Nino.Serialization.Deserializer.Deserialize<PlayerLoginState2>(Convert.FromBase64String(test3));
            Debug.Log("test2 Deserialize OK");

运行结果:

test1 Serialize OK >42bkZgAA
test1 Deserialize OK
test2 Serialize OK >42bkZgAA
InvalidOperationException: The type System.Int32 does not have NinoSerialize attribute or custom importer/exporter
==========ILRuntime StackTrace==========
IL_0382: call !0 System.Runtime.CompilerServices.TaskAwaiter`1<System.Boolean>::GetResult()
HotUpdateScripts.Lcgames.LoadingPanel/<AccountLogin>d__17.MoveNext() (at HotUpdateScripts/Lcgames/UI/Panel/Base/LoadingPanel.cs:16707566)
--- End of stack trace from previous location ---
IL_00e9: call !!0 Nino.Serialization.Deserializer::Deserialize<HotUpdateScripts.Lcgames.PlayerLoginState2>(System.Byte[],System.Text.Encoding,Nino.Serialization.CompressOption)

热更工程如果不调用 playerLoginState2.TestService.Add(0); 也不会出问题

在je热更新工程 有问题

序列化类 放在主工程

using Nino.Serialization;

namespace NinoData.Chat
{
    [NinoSerialize]
    public partial class SystemData
    {
        [NinoMember(1)]
        public string name;
        [NinoMember(2)]
        public string notice;
    }
}

主工程测试 测试ok

var data = Nino.Serialization.Serializer.Serialize(new NinoData.Chat.SystemData() { name = "111", notice = "bbb" });
        Nino.Serialization.Deserializer.Deserialize< NinoData.Chat.SystemData> (data);
        Debug.LogError("主工程ok");

热更工程

        NinoData.Chat.SystemData systemData = new NinoData.Chat.SystemData() { name = "123" };
            var dt = Nino.Serialization.Serializer.Serialize(systemData);
          var data =  Nino.Serialization.Deserializer.Deserialize<NinoData.Chat.SystemData> (dt);

报错:

InvalidOperationException: Failed to retrieve unbox type
Nino.Serialization.Serializer.Serialize[T] (System.Type type, T value, Nino.Serialization.Writer writer, Nino.Serialization.CompressOption option, System.Boolean returnValue) (at Assets/Dependencies/Nino/Serialization/Serializer.cs:215)
Nino.Serialization.Serializer.Serialize[T] (System.Type type, T value, Nino.Serialization.Writer writer, Nino.Serialization.CompressOption option, System.Boolean returnValue) (at Assets/Dependencies/Nino/Serialization/Serializer.cs:211)
Nino.Serialization.Serializer.Serialize[T] (T val, Nino.Serialization.CompressOption option) (at Assets/Dependencies/Nino/Serialization/Serializer.cs:51)
System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <1f66344f2f89470293d8b67d71308c07>:0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <1f66344f2f89470293d8b67d71308c07>:0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <1f66344f2f89470293d8b67d71308c07>:0)
ILRuntime.CLR.Method.CLRMethod.Invoke (ILRuntime.Runtime.Intepreter.ILIntepreter intepreter, ILRuntime.Runtime.Stack.StackObject* esp, System.Collections.Generic.List1[T] mStack, System.Boolean isNewObj) (at Assets/Dependencies/ILRuntime/ILRuntime/CLR/Method/CLRMethod.cs:346) ILRuntime.Runtime.Intepreter.ILIntepreter.Execute (ILRuntime.CLR.Method.ILMethod method, ILRuntime.Runtime.Stack.StackObject* esp, System.Boolean& unhandledException) (at Assets/Dependencies/ILRuntime/ILRuntime/Runtime/Intepreter/ILIntepreter.cs:2103) Rethrow as ILRuntimeException: Exception has been thrown by the target of an invocation. IL_004b: call System.Byte[] Nino.Serialization.Serializer::Serialize<NinoData.Chat.SystemData>(!!0,Nino.Serialization.CompressOption) UI.LoginGame.LoginGame.Start() (at HotUpdateScripts/UI/LoginGame/LoginGame.cs:35) IL_004b: call System.Byte[] Nino.Serialization.Serializer::Serialize<NinoData.Chat.SystemData>(!!0,Nino.Serialization.CompressOption) UI.LoginGame.LoginGame.Start() (at HotUpdateScripts/UI/LoginGame/LoginGame.cs:35) UnityEngine.DebugLogHandler:LogException(Exception, Object) JEngine.Core.Logger:LogException(Exception, Object) (at Assets/Dependencies/JEngine/Core/Logger/LogHandler.cs:201) UnityEngine.Debug:LogException(Exception) JEngine.Core.LifeCycleMgr:ExecuteItems(List1, Boolean, Func`2) (at Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs:326)
JEngine.Core.LifeCycleMgr:LateUpdate() (at Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs:485)

模拟器下,对齐导致安卓闪退问题。

unity3d版本:2021.3.21f1
nino版本:1.0.21(release v1.0.4)
运行平台:安卓雷电模拟器
复现方式:经反复详细测试,当导出数据类型是float/double时,而且表单中数据,恰巧是整数值,比如1/2/3等,在安卓模拟器中会出现崩溃情况。但是在Unity编辑器中能稳定运行。
QQ截图20230522200111
QQ截图20230522200127
QQ截图20230522200235

嵌套使用生成失败

[NinoSerialize]
public partial class IntRange
{
    [NinoMember(0)]
    public int _min;
    [NinoMember(1)]
    public int _max;
}

[NinoSerialize]
public partial class Item
{
    [NinoMember(0)]
    public IntRange Range;
}

疑似有内存泄漏

image

这里计算是否要扩容可能需要修改为:index <= TotalLength

否则如果不断调用隐式转换,TotalLength会不断增加:

image

自动变量收集模式下,反序列化错误

[NinoSerialize(true)]
public partial class IncludeAllClass
{
    public int a;
    public long b;
    public float c;
    public double d;
    public string str;
}

[NinoSerialize(true)]模式下:
问题 : 字段str未初始化时, 反序列化异常;
期望 : string 反序列化时做 空判断

字典嵌套反序列化在热更工程报错

[Serializable]
[NinoSerialize]
public partial class test
{
[NinoMember(0)] public Dictionary<int, Dictionary<int, string>> testA;
}

主工程没问题

The type System.Int32 does not have NinoSerialize attribute or custom importer/exporter

使用Jengine 在热更工程里无法反序列化

MessagePacket:

public struct MessagePacket
{
    public byte MessageID;
    public ArraySegment<byte> MessageData;
    public MessagePacket(byte messageID, ArraySegment<byte> messageData)
    {
        MessageData = messageData;
        MessageID = messageID;

    }
    public MessagePacket(byte messageID, byte[] messageData)
    {
        MessageData = messageData;
        MessageID = messageID;

    }
    public static MessagePacket ReadFrom(ArraySegment<byte> data)
    {
        return new MessagePacket(data.Array[0], data.Slice(1));
    }
    public static MessagePacket ReadFrom(byte[] data)
    {
        return new MessagePacket(data[0], data.AsSpan().Slice(1).ToArray());
    }
    public byte[] ToBytes()
    {
        var buffer = new byte[MessageData.Count + 1];
        buffer[0] = MessageID;
        MessageData.CopyTo(buffer, 1);
        return buffer;
    }

}

Npc:

[NinoSerialize]
public partial class Npc
{
    
 
        [NinoMember(1)]
        public int InstanceID;
        [NinoMember(2)]
        public int NpcID;
        [NinoMember(3)]
        public Vector3 ServerPosition;
        [NinoMember(4)]
        public bool IsMove;
        [NinoMember(5)]
        public int Blood;
    
}

主工程测试:

    var npc = new Npc();
    npc.NpcID = 1;
    npc.ServerPosition = new Vector3(0f, 0f, 0f);
    var messagePacket = new MessagePacket(0x02, Nino.Serialization.Serializer.Serialize(npc));
    var temp = messagePacket.ToBytes();

    var rst = MessagePacket.ReadFrom(temp);
    var npc2 = Nino.Serialization.Deserializer.Deserialize<Npc>(rst.MessageData);
    Debug.Log(npc2.NpcID);
    Debug.Log(npc2.ServerPosition);

输出

TestNino
(0.00, 0.00, 0.00)

热更工程测试:

TestNino
Specified cast is not valid.

多态相关,抽象类直接作为成员变量时序列化报错

多态相关,抽象类直接作为成员变量时序列化报错

using Nino.Serialization;
using UnityEngine;

namespace Nino.Test.Editor.Serialization
{
    public abstract class AbstractClass
    {
        [NinoMember(1)]
        public int B;
    }
    
    [NinoSerialize]
    public class ClassA: AbstractClass
    {
        [NinoMember(2)]
        public int A;
    }
    
    [NinoSerialize]
    public class ClassB
    {
        [NinoMember(1)]
        public AbstractClass Class;
    }
    public static class Test12
    {
        private const string SerializationTest12 = "Nino/Test/Serialization/Test12 - Serialize (Abstract)";

        [UnityEditor.MenuItem(SerializationTest12,priority=12)]
        public static void Main()
        {
            ClassB b = new ClassB();
            b.Class = new ClassA()
            {
                A = 1,
                B = 2,
            };

            var bytes = Serializer.Serialize(b);
            ClassB bb = Deserializer.Deserialize<ClassB>(bytes);
            Debug.Log(bb.Class.GetType());
        }
    }
}

InvalidOperationException: The type Nino.Test.Editor.Serialization.AbstractClass does not have NinoSerialize attribute or custom importer/exporter
Nino.Serialization.TypeModel.TryGetModel (System.Type type, Nino.Serialization.TypeModel& model) (at Assets/Nino/Serialization/TypeModel.cs:207)
Nino.Serialization.Serializer.Serialize[T] (System.Type type, T value, Nino.Serialization.Writer writer, Nino.Serialization.CompressOption option, System.Boolean returnValue) (at Assets/Nino/Serialization/Serializer.cs:171)
Nino.Serialization.Serializer.Serialize[T] (System.Type type, T value, Nino.Serialization.Writer writer, Nino.Serialization.CompressOption option, System.Boolean returnValue) (at Assets/Nino/Serialization/Serializer.cs:218)
Nino.Serialization.Serializer.Serialize[T] (T val, Nino.Serialization.CompressOption option) (at Assets/Nino/Serialization/Serializer.cs:51)
Nino.Test.Editor.Serialization.Test12.Main () (at Assets/Nino/Test/Editor/Serialization/Test12.cs:39)

-1 (int类型)会被Nino 反序列化成 255

using System.Collections.Generic;
using JEngine.Core;
using Nino.Serialization;
using UnityEngine;

namespace Nino.Test
{
    public class NinoDemo : MonoBehaviour
    {
        [NinoSerialize]
        public class NinoTestData
        {
            public enum Sex
            {
                Male,
                Female
            }

            [NinoMember(1)] public string name;
            [NinoMember(2)] public int id;
            [NinoMember(3)] public bool isHasPet;
            [NinoMember(4)] public Sex sex;
        }

        public void Awake()
        {
            var _list = new List<NinoTestData>();
            _list.Add(new NinoTestData
            {
                sex = NinoTestData.Sex.Male,
                name = "A",
                id = -1,
                isHasPet = false
            });
            _list.Add(new NinoTestData
            {
                sex = NinoTestData.Sex.Male,
                name = "B",
                id = 1,
                isHasPet = true
            });

            var buf = Serializer.Serialize(_list);
            Log.Print($"Nino 将_list数据序列化为了 {buf.Length} bytes");

            var _list2 = Deserializer.Deserialize<List<NinoTestData>>(buf);
            Log.Print($"Nino 反序列化了一个_list2,内部有{_list2.Count}个元素");
            Log.Print($"_list2[0].sex = {_list2[0].sex}\n" +
                      $"_list2[0].name = {_list2[0].name}\n" +
                      $"_list2[0].id = {_list2[0].id}\n" +
                      $"_list2[0].isHasPet = {_list2[0].isHasPet}\n");
            Log.Print($"_list2[1].sex = {_list2[1].sex}\n" +
                      $"_list2[1].name = {_list2[1].name}\n" +
                      $"_list2[1].id = {_list2[1].id}\n" +
                      $"_list2[1].isHasPet = {_list2[1].isHasPet}\n");

            var _arr = new NinoTestData[2];
            _arr[0] = new NinoTestData
            {
                sex = NinoTestData.Sex.Male,
                name = "C",
                id = 2,
                isHasPet = true
            };
            _arr[1] = new NinoTestData
            {
                sex = NinoTestData.Sex.Male,
                name = "D",
                id = 3,
                isHasPet = false
            };

            buf = Serializer.Serialize(_arr);
            Log.Print($"Nino 将_arr数据序列化为了 {buf.Length} bytes");

            var _arr2 = Deserializer.Deserialize<List<NinoTestData>>(buf);
            Log.Print($"Nino 反序列化了一个_arr2,内部有{_arr2.Count}个元素");
            Log.Print($"_arr2[0].sex = {_arr2[0].sex}\n" +
                      $"_arr2[0].name = {_arr2[0].name}\n" +
                      $"_arr2[0].id = {_arr2[0].id}\n" +
                      $"_arr2[0].isHasPet = {_arr2[0].isHasPet}\n");
            Log.Print($"_arr2[1].sex = {_arr2[1].sex}\n" +
                      $"_arr2[1].name = {_arr2[1].name}\n" +
                      $"_arr2[1].id = {_arr2[1].id}\n" +
                      $"_arr2[1].isHasPet = {_arr2[1].isHasPet}\n");
        }
    }
}

NinoSerialize(false)序列化报错

[NinoSerialize(false)] public partial class componentB : MonoBehaviour 
{
    [NinoMember(0)]
    public int bb = 2;
}

serialize(false) 单独设置member报错

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.