zwq00000 4 лет назад
Родитель
Сommit
194255ac1f
24 измененных файлов: 1728 добавлений и 275 удалений
  1. Двоичные данные
      doc/GBT 32960.3-2016 电动汽车远程服务与管理系统技术规范 第3部分:通讯协议及数据格式.pdf
  2. Двоичные данные
      doc/GBT32960-2016电动汽车远程服务与管理系统技术规范 第1部分:总则.pdf
  3. Двоичные данные
      doc/GBT32960-2016电动汽车远程服务与管理系统技术规范 第2部分:车载终端.pdf
  4. Двоичные данные
      doc/GBT32960-2016电动汽车远程服务与管理系统技术规范 第3部分:通信协议及数据格式.pdf
  5. +1483
    -0
      doc/GBT32960.md
  6. +2
    -2
      src/JTNE.Protocol.Benchmark/JTNESerializerContext.cs
  7. +1
    -1
      src/JTNE.Protocol.Test/Extensions/JTNEPackageExtensionsTest.cs
  8. +28
    -4
      src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs
  9. +8
    -8
      src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs
  10. +2
    -2
      src/JTNE.Protocol.Test/Package/JTNE_0x02_PackageTest.cs
  11. +4
    -4
      src/JTNE.Protocol.Test/Package/JTNE_0x04_PackageTest.cs
  12. +4
    -4
      src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs
  13. +4
    -4
      src/JTNE.Protocol.Test/Package/JTNE_0x06_PackageTest.cs
  14. +4
    -4
      src/JTNE.Protocol.Test/Package/JTNE_0x07_PackageTest.cs
  15. +4
    -4
      src/JTNE.Protocol.Test/Package/JTNE_0x08_PackageTest.cs
  16. +7
    -13
      src/JTNE.Protocol/Enums/JTNEAskId.cs
  17. +25
    -27
      src/JTNE.Protocol/Enums/JTNEMsgId.cs
  18. +58
    -85
      src/JTNE.Protocol/Extensions/JTNEEnumExtensions.cs
  19. +23
    -29
      src/JTNE.Protocol/Extensions/JTNEPackageExtensions.cs
  20. +6
    -6
      src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs
  21. +25
    -34
      src/JTNE.Protocol/Internal/JTNEMsgIdFactory.cs
  22. +14
    -8
      src/JTNE.Protocol/JTNEGlobalConfigs.cs
  23. +2
    -2
      src/JTNE.Protocol/JTNEPackage.cs
  24. +24
    -34
      src/JTNE.Protocol/JTNESerializer.cs

Двоичные данные
doc/GBT 32960.3-2016 电动汽车远程服务与管理系统技术规范 第3部分:通讯协议及数据格式.pdf Просмотреть файл


Двоичные данные
doc/GBT32960-2016电动汽车远程服务与管理系统技术规范 第1部分:总则.pdf Просмотреть файл


Двоичные данные
doc/GBT32960-2016电动汽车远程服务与管理系统技术规范 第2部分:车载终端.pdf Просмотреть файл


Двоичные данные
doc/GBT32960-2016电动汽车远程服务与管理系统技术规范 第3部分:通信协议及数据格式.pdf Просмотреть файл


+ 1483
- 0
doc/GBT32960.md
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


+ 2
- 2
src/JTNE.Protocol.Benchmark/JTNESerializerContext.cs Просмотреть файл

@@ -34,8 +34,8 @@ namespace JTNE.Protocol.Benchmark
for (int i = 0; i < N; i++)
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.Success.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.uploadim.ToByteValue();
jTNEPackage.AskId = JTNEAskId.Success;
jTNEPackage.MsgId = JTNEMsgId.UploadIM;
jTNEPackage.VIN = "123456789";
JTNE_0x02 jTNE_0X02 = new JTNE_0x02();
jTNE_0X02.Values = new Dictionary<byte, JTNE_0x02_Body>();


+ 1
- 1
src/JTNE.Protocol.Test/Extensions/JTNEPackageExtensionsTest.cs Просмотреть файл

@@ -13,7 +13,7 @@ namespace JTNE.Protocol.Test.Extensions
[Fact]
public void Test1()
{
JTNEPackage jTNEPackage= JTNEMsgId.login.Create("123456789", JTNEAskId.CMD, new JTNE_0x01
JTNEPackage jTNEPackage= JTNEMsgId.Login.Create("123456789", JTNEAskId.CMD, new JTNE_0x01
{
PDATime = DateTime.Parse("2019-01-22 23:55:56"),
LoginNum = 1,


+ 28
- 4
src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs Просмотреть файл

@@ -21,7 +21,7 @@ namespace JTNE.Protocol.Test {
JTNEHeaderPackage jTNEHeaderPackage = new JTNEHeaderPackage ();
jTNEHeaderPackage.VIN = "123456789";
jTNEHeaderPackage.AskId = JTNEAskId.CMD.ToByteValue ();
jTNEHeaderPackage.MsgId = JTNEMsgId.login.ToByteValue ();
jTNEHeaderPackage.MsgId = JTNEMsgId.Login.ToByteValue ();
JTNE_0x01 jTNE_0X01 = new JTNE_0x01 ();
jTNE_0X01.PDATime = DateTime.Parse ("2019-01-22 23:55:56");
jTNE_0X01.LoginNum = 1;
@@ -42,7 +42,7 @@ namespace JTNE.Protocol.Test {
var data = "232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD".ToHexBytes ();
JTNEHeaderPackage jTNEHeaderPackage = JTNESerializer.Deserialize<JTNEHeaderPackage> (data);
Assert.Equal (JTNEAskId.CMD.ToByteValue (), jTNEHeaderPackage.AskId);
Assert.Equal (JTNEMsgId.login.ToByteValue (), jTNEHeaderPackage.MsgId);
Assert.Equal (JTNEMsgId.Login.ToByteValue (), jTNEHeaderPackage.MsgId);
Assert.Equal ("123456789", jTNEHeaderPackage.VIN);
JTNE_0x01 jTNE_0X01 = JTNESerializer.Deserialize<JTNE_0x01> (jTNEHeaderPackage.Bodies);
Assert.Equal (DateTime.Parse ("2019-01-22 23:55:56"), jTNE_0X01.PDATime);
@@ -60,8 +60,8 @@ namespace JTNE.Protocol.Test {
JTNEGlobalConfigs.Instance.Encoding = Encoding.GetEncoding ("GB18030");
var data = "23 23 05 FE 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 31 31 01 00 29 14 07 14 13 26 22 00 01 CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB B3 B5 C1 AA CD F2 01 02 01 A1".ToHexBytes ();
var package = JTNESerializer.Deserialize (data);
Assert.Equal (JTNEAskId.CMD.ToByteValue (), package.AskId);
Assert.Equal (JTNEMsgId.platformlogin.ToByteValue (), package.MsgId);
Assert.Equal (JTNEAskId.CMD, package.AskId);
Assert.Equal (JTNEMsgId.PlatformLogin, package.MsgId);
Assert.Equal (41, package.DataUnitLength);
Assert.NotNull (package.Bodies);

@@ -75,5 +75,29 @@ namespace JTNE.Protocol.Test {
Assert.Equal (JTNEEncryptMethod.None, loginbody.EncryptMethod);

}

[Fact]
public void TestGenerateReply(){
JTNEGlobalConfigs.Instance.Encoding = Encoding.GetEncoding ("GB18030");
var data = "23 23 05 FE 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 31 31 01 00 29 14 07 14 13 26 22 00 01 CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB B3 B5 C1 AA CD F2 01 02 01 A1".ToHexBytes ();
var package = JTNESerializer.Deserialize (data);
var reply = package.GenerateReply(JTNEAskId.Success);
Assert.NotNull(reply);
var bytes = JTNESerializer.Serialize(reply);
output.WriteLine(bytes.ToHexString());

}
}

public static class JTNEReplyExtensions{

public static JTNEPackage GenerateReply(this JTNEPackage source,JTNEAskId askId){
return new JTNEPackage(){
MsgId = source.MsgId,
AskId = askId,
VIN = source.VIN,
DataUnitLength = 0
};
}
}
}

+ 8
- 8
src/JTNE.Protocol.Test/Package/JTNE_0x01_PackageTest.cs Просмотреть файл

@@ -15,8 +15,8 @@ namespace JTNE.Protocol.Test.Package
public void Test1()
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.login.ToByteValue();
jTNEPackage.AskId = JTNEAskId.CMD;
jTNEPackage.MsgId = JTNEMsgId.Login;
jTNEPackage.VIN = "123456789";
JTNE_0x01 jTNE_0X01 = new JTNE_0x01();
jTNE_0X01.PDATime = DateTime.Parse("2019-01-22 23:55:56");
@@ -39,8 +39,8 @@ namespace JTNE.Protocol.Test.Package
{
var data = "232301FE313233343536373839000000000000000001002A130116173738000131323334353637383939383736353433323130300304313233343435363739383730FD".ToHexBytes();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.login.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal(JTNEAskId.CMD, jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.Login, jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);

JTNE_0x01 jTNE_0X01 = jTNEPackage.Bodies as JTNE_0x01;
@@ -68,8 +68,8 @@ namespace JTNE.Protocol.Test.Package
}
});
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.login.ToByteValue();
jTNEPackage.AskId = JTNEAskId.CMD;
jTNEPackage.MsgId = JTNEMsgId.Login;
jTNEPackage.VIN = "123456789";
jTNEPackage.EncryptMethod = JTNEEncryptMethod.AES128;
JTNE_0x01 jTNE_0X01 = new JTNE_0x01();
@@ -103,8 +103,8 @@ namespace JTNE.Protocol.Test.Package
});
var data = "232301FE31323334353637383900000000000000000300307C9AAF67FB9408A75FAFC1C87F1E2AECD79DDAB8219016A5DD0911283922805EF450045EA3611C0D5CFBFD8F2581CEED30".ToHexBytes();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.login.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal(JTNEAskId.CMD, jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.Login, jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);
Assert.Equal(JTNEEncryptMethod.AES128, jTNEPackage.EncryptMethod);



+ 2
- 2
src/JTNE.Protocol.Test/Package/JTNE_0x02_PackageTest.cs Просмотреть файл

@@ -15,8 +15,8 @@ namespace JTNE.Protocol.Test.Package
public void Test1()
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.Success.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.uploadim.ToByteValue();
jTNEPackage.AskId = JTNEAskId.Success;
jTNEPackage.MsgId = JTNEMsgId.UploadIM;
jTNEPackage.VIN = "123456789";
JTNE_0x02 jTNE_0X02 = new JTNE_0x02();
jTNE_0X02.Values = new Dictionary<byte, JTNE_0x02_Body>();


+ 4
- 4
src/JTNE.Protocol.Test/Package/JTNE_0x04_PackageTest.cs Просмотреть файл

@@ -14,8 +14,8 @@ namespace JTNE.Protocol.Test.Package
public void Test1()
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.loginout.ToByteValue();
jTNEPackage.AskId = JTNEAskId.CMD;
jTNEPackage.MsgId = JTNEMsgId.Logout;
jTNEPackage.VIN = "123456789";
JTNE_0x04 jTNE_0X04 = new JTNE_0x04();
jTNE_0X04.LogoutTime = DateTime.Parse("2019-01-23 23:55:56");
@@ -30,8 +30,8 @@ namespace JTNE.Protocol.Test.Package
{
var data = "232304FE31323334353637383900000000000000000100081301171737380001DE".ToHexBytes();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.loginout.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal(JTNEAskId.CMD, jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.Logout, jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);
JTNE_0x04 jTNE_0X04 = jTNEPackage.Bodies as JTNE_0x04;
Assert.Equal(DateTime.Parse("2019-01-23 23:55:56"), jTNE_0X04.LogoutTime);


+ 4
- 4
src/JTNE.Protocol.Test/Package/JTNE_0x05_PackageTest.cs Просмотреть файл

@@ -11,8 +11,8 @@ namespace JTNE.Protocol.Test.Package {
[Fact]
public void Test1 () {
JTNEPackage jTNEPackage = new JTNEPackage ();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue ();
jTNEPackage.MsgId = JTNEMsgId.platformlogin.ToByteValue ();
jTNEPackage.AskId = JTNEAskId.CMD;
jTNEPackage.MsgId = JTNEMsgId.PlatformLogin;
jTNEPackage.VIN = "123456789";
JTNE_0x05 jTNE_0X05 = new JTNE_0x05 ();
jTNE_0X05.LoginTime = DateTime.Parse ("2019-01-23 23:55:56");
@@ -28,8 +28,8 @@ namespace JTNE.Protocol.Test.Package {
public void Test2 () {
var data = "232305FE31323334353637383900000000000000000100291301171737381A0A536D616C6C43686935313800313233343536373839303132333435363738390001FF".ToHexBytes ();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize (data);
Assert.Equal (JTNEAskId.CMD.ToByteValue (), jTNEPackage.AskId);
Assert.Equal (JTNEMsgId.platformlogin.ToByteValue (), jTNEPackage.MsgId);
Assert.Equal (JTNEAskId.CMD, jTNEPackage.AskId);
Assert.Equal (JTNEMsgId.PlatformLogin, jTNEPackage.MsgId);
Assert.Equal ("123456789", jTNEPackage.VIN);
JTNE_0x05 jTNE_0X05 = jTNEPackage.Bodies as JTNE_0x05;
Assert.Equal (DateTime.Parse ("2019-01-23 23:55:56"), jTNE_0X05.LoginTime);


+ 4
- 4
src/JTNE.Protocol.Test/Package/JTNE_0x06_PackageTest.cs Просмотреть файл

@@ -14,8 +14,8 @@ namespace JTNE.Protocol.Test.Package
public void Test1()
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.platformlogout.ToByteValue();
jTNEPackage.AskId = JTNEAskId.CMD;
jTNEPackage.MsgId = JTNEMsgId.PlatformLogout;
jTNEPackage.VIN = "123456789";
JTNE_0x06 jTNE_0X06 = new JTNE_0x06();
jTNE_0X06.LogoutTime = DateTime.Parse("2019-01-23 23:55:56");
@@ -30,8 +30,8 @@ namespace JTNE.Protocol.Test.Package
{
var data = "232306FE31323334353637383900000000000000000100081301171737380001DC".ToHexBytes();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.platformlogout.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal(JTNEAskId.CMD, jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.PlatformLogout, jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);
JTNE_0x06 jTNE_0X06 = jTNEPackage.Bodies as JTNE_0x06;
Assert.Equal(DateTime.Parse("2019-01-23 23:55:56"), jTNE_0X06.LogoutTime);


+ 4
- 4
src/JTNE.Protocol.Test/Package/JTNE_0x07_PackageTest.cs Просмотреть файл

@@ -14,8 +14,8 @@ namespace JTNE.Protocol.Test.Package
public void Test1()
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.heartbeat.ToByteValue();
jTNEPackage.AskId = JTNEAskId.CMD;
jTNEPackage.MsgId = JTNEMsgId.HeartBeat;
jTNEPackage.VIN = "123456789";
var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString();
Assert.Equal("232307FE3132333435363738390000000000000000010000C9", hex);
@@ -26,8 +26,8 @@ namespace JTNE.Protocol.Test.Package
{
var data = "232307FE3132333435363738390000000000000000010000C9".ToHexBytes();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.heartbeat.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal(JTNEAskId.CMD, jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.HeartBeat, jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);
Assert.Null(jTNEPackage.Bodies);
}


+ 4
- 4
src/JTNE.Protocol.Test/Package/JTNE_0x08_PackageTest.cs Просмотреть файл

@@ -14,8 +14,8 @@ namespace JTNE.Protocol.Test.Package
public void Test1()
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = JTNEAskId.CMD.ToByteValue();
jTNEPackage.MsgId = JTNEMsgId.checktime.ToByteValue();
jTNEPackage.AskId = JTNEAskId.CMD;
jTNEPackage.MsgId = JTNEMsgId.CheckTime;
jTNEPackage.VIN = "123456789";
var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString();
Assert.Equal("232308FE3132333435363738390000000000000000010000C6", hex);
@@ -26,8 +26,8 @@ namespace JTNE.Protocol.Test.Package
{
var data = "232308FE3132333435363738390000000000000000010000C6".ToHexBytes();
JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data);
Assert.Equal(JTNEAskId.CMD.ToByteValue(), jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.checktime.ToByteValue(), jTNEPackage.MsgId);
Assert.Equal(JTNEAskId.CMD, jTNEPackage.AskId);
Assert.Equal(JTNEMsgId.CheckTime, jTNEPackage.MsgId);
Assert.Equal("123456789", jTNEPackage.VIN);
Assert.Null(jTNEPackage.Bodies);
}


+ 7
- 13
src/JTNE.Protocol/Enums/JTNEAskId.cs Просмотреть файл

@@ -1,29 +1,23 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JTNE.Protocol.Enums
{
namespace JTNE.Protocol.Enums {
/// <summary>
/// 应答标志
/// </summary>
public enum JTNEAskId:byte
{
public enum JTNEAskId : byte {
/// <summary>
/// 接收到的信息正确
/// </summary>
Success=0x01,
Success = 0x01,
/// <summary>
/// 设置未成功
/// </summary>
Error=0x02,
Error = 0x02,
/// <summary>
/// VIN重复错误
/// </summary>
VinRepeatError=0x03,
VinRepeatError = 0x03,
/// <summary>
/// 数据包为命令包,而非应答包
/// </summary>
CMD=0xFE
CMD = 0xFE
}
}
}

+ 25
- 27
src/JTNE.Protocol/Enums/JTNEMsgId.cs Просмотреть файл

@@ -1,66 +1,64 @@
using JTNE.Protocol.Attributes;
using JTNE.Protocol.MessageBody;
using System;
using System;
using System.Collections.Generic;
using System.Text;
using JTNE.Protocol.Attributes;
using JTNE.Protocol.MessageBody;

namespace JTNE.Protocol.Enums
{
namespace JTNE.Protocol.Enums {
/// <summary>
/// 命令单元
/// </summary>
public enum JTNEMsgId:byte
{
public enum JTNEMsgId : byte {
/// <summary>
/// 车辆登入
/// </summary>
[JTNEBodiesType(typeof(JTNE_0x01))]
login = 0x01,
[JTNEBodiesType (typeof (JTNE_0x01))]
Login = 0x01,
/// <summary>
/// 实时信息上传
/// </summary>
[JTNEBodiesType(typeof(JTNE_0x02))]
uploadim = 0x02,
[JTNEBodiesType (typeof (JTNE_0x02))]
UploadIM = 0x02,
/// <summary>
/// 补传信息上传
/// </summary>
uploadsup = 0x03,
UploadSup = 0x03,
/// <summary>
/// 车辆登出
/// </summary>
[JTNEBodiesType(typeof(JTNE_0x04))]
loginout = 0x04,
[JTNEBodiesType (typeof (JTNE_0x04))]
Logout = 0x04,
/// <summary>
/// 平台登入
/// </summary>
[JTNEBodiesType(typeof(JTNE_0x05))]
platformlogin = 0x05,
[JTNEBodiesType (typeof (JTNE_0x05))]
PlatformLogin = 0x05,
/// <summary>
/// 平台登出
/// </summary>
[JTNEBodiesType(typeof(JTNE_0x06))]
platformlogout = 0x06,
[JTNEBodiesType (typeof (JTNE_0x06))]
PlatformLogout = 0x06,
/// <summary>
/// 心跳
/// 心跳
/// </summary>
[JTNEBodiesType(typeof(JTNE_0x07))]
heartbeat = 0x07,
[JTNEBodiesType (typeof (JTNE_0x07))]
HeartBeat = 0x07,
/// <summary>
/// 终端校时
/// </summary>
[JTNEBodiesType(typeof(JTNE_0x08))]
checktime = 0x08,
[JTNEBodiesType (typeof (JTNE_0x08))]
CheckTime = 0x08,
/// <summary>
/// 查询命令
/// </summary>
query = 0x80,
Query = 0x80,
/// <summary>
/// 设置命令
/// </summary>
settings = 0x81,
Settings = 0x81,
/// <summary>
/// 控制命令
/// </summary>
control = 0x82
Control = 0x82
}
}
}

+ 58
- 85
src/JTNE.Protocol/Extensions/JTNEEnumExtensions.cs Просмотреть файл

@@ -4,22 +4,19 @@ using System.ComponentModel;
using System.Linq;
using System.Reflection;

namespace JTNE.Protocol.Extensions
{
namespace JTNE.Protocol.Extensions {
/// <summary>
/// 枚举扩展
/// </summary>
public static class JT808EnumExtensions
{
public static class JT808EnumExtensions {
/// <summary>
/// 转为整型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static int ToValue<T>(this T t) where T : struct
{
return Convert.ToInt32(t);
public static int ToValue<T> (this T t) where T : struct {
return Convert.ToInt32 (t);
}

/// <summary>
@@ -28,9 +25,8 @@ namespace JTNE.Protocol.Extensions
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static ushort ToUInt16Value<T>(this T t) where T : struct
{
return Convert.ToUInt16(t);
public static ushort ToUInt16Value<T> (this T t) where T : struct {
return Convert.ToUInt16 (t);
}

/// <summary>
@@ -39,9 +35,8 @@ namespace JTNE.Protocol.Extensions
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static byte ToByteValue<T>(this T t) where T : struct
{
return Convert.ToByte(t);
public static byte ToByteValue<T> (this T t) where T : struct {
return Convert.ToByte (t);
}

/// <summary>
@@ -50,9 +45,8 @@ namespace JTNE.Protocol.Extensions
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static string ToValueString<T>(this T t) where T : struct
{
return Convert.ToInt32(t).ToString();
public static string ToValueString<T> (this T t) where T : struct {
return Convert.ToInt32 (t).ToString ();
}

/// <summary>
@@ -61,18 +55,16 @@ namespace JTNE.Protocol.Extensions
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T ToEnum<T>(this string value) where T : struct
{
return (T)Enum.Parse(typeof(T), value);
public static T ToEnum<T> (this string value) where T : struct {
return (T) Enum.Parse (typeof (T), value);
}

/// <summary>
/// 获取枚举字符串
/// </summary>
/// <param name="valueEnum"></param>
public static string GetName(this Enum valueEnum)
{
return valueEnum.ToString();
public static string GetName (this Enum valueEnum) {
return valueEnum.ToString ();
}

/// <summary>
@@ -80,10 +72,9 @@ namespace JTNE.Protocol.Extensions
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string GetDescription(this Enum value)
{
var attribute = value.GetAttribute<DescriptionAttribute>();
return attribute == null ? value.ToString() : attribute.Description;
public static string GetDescription (this Enum value) {
var attribute = value.GetAttribute<DescriptionAttribute> ();
return attribute == null ? value.ToString () : attribute.Description;
}

/// <summary>
@@ -92,24 +83,21 @@ namespace JTNE.Protocol.Extensions
/// <typeparam name="TEnum"></typeparam>
/// <param name="enumValue"></param>
/// <returns></returns>
public static bool IsEnumValid<TEnum>(this int enumValue)
{
return Enum.IsDefined(typeof(TEnum), enumValue);
public static bool IsEnumValid<TEnum> (this int enumValue) {
return Enum.IsDefined (typeof (TEnum), enumValue);
}

/// <summary>
/// 获取DescriptionAttribute特性枚举及描述
/// </summary>
/// <param name="type"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Dictionary<string, string> GetDescriptionAttributeDictionary(this Enum value)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
var fields = value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (var fi in fields)
{
DescriptionAttribute attr = Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute), false) as DescriptionAttribute;
dictionary.Add(fi.Name, attr != null ? attr.Description : "");
public static Dictionary<string, string> GetDescriptionAttributeDictionary (this Enum value) {
Dictionary<string, string> dictionary = new Dictionary<string, string> ();
var fields = value.GetType ().GetFields (BindingFlags.Static | BindingFlags.Public);
foreach (var fi in fields) {
DescriptionAttribute attr = Attribute.GetCustomAttribute (fi, typeof (DescriptionAttribute), false) as DescriptionAttribute;
dictionary.Add (fi.Name, attr != null ? attr.Description : "");
}
return dictionary;
}
@@ -117,27 +105,24 @@ namespace JTNE.Protocol.Extensions
/// <summary>
/// 获取DisplayNameAttribute特性枚举值的描述
/// </summary>
/// <param name="obj">枚举值</param>
/// <param name="value">枚举值</param>
/// <returns></returns>
public static string GetDisplayName(this Enum value)
{
var attribute = value.GetAttribute<DisplayNameAttribute>();
return attribute == null ? value.ToString() : attribute.DisplayName;
public static string GetDisplayName (this Enum value) {
var attribute = value.GetAttribute<DisplayNameAttribute> ();
return attribute == null ? value.ToString () : attribute.DisplayName;
}

/// <summary>
/// 获取DisplayNameAttribute特性枚举及描述
/// </summary>
/// <param name="type"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Dictionary<string, string> GetDisplayNameAttributeDictionary(this Enum value)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
var fields = value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (var fi in fields)
{
DisplayNameAttribute attr = Attribute.GetCustomAttribute(fi, typeof(DisplayNameAttribute), false) as DisplayNameAttribute;
dictionary.Add(fi.Name, attr != null ? attr.DisplayName : "");
public static Dictionary<string, string> GetDisplayNameAttributeDictionary (this Enum value) {
Dictionary<string, string> dictionary = new Dictionary<string, string> ();
var fields = value.GetType ().GetFields (BindingFlags.Static | BindingFlags.Public);
foreach (var fi in fields) {
DisplayNameAttribute attr = Attribute.GetCustomAttribute (fi, typeof (DisplayNameAttribute), false) as DisplayNameAttribute;
dictionary.Add (fi.Name, attr != null ? attr.DisplayName : "");
}
return dictionary;
}
@@ -148,17 +133,13 @@ namespace JTNE.Protocol.Extensions
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T GetAttribute<T>(this Enum value) where T : Attribute
{
try
{
var type = value.GetType();
var memberInfo = type.GetMember(value.ToString());
var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false);
return (T)attributes[0];
}
catch
{
public static T GetAttribute<T> (this Enum value) where T : Attribute {
try {
var type = value.GetType ();
var memberInfo = type.GetMember (value.ToString ());
var attributes = memberInfo[0].GetCustomAttributes (typeof (T), false);
return (T) attributes[0];
} catch {
return default;
}
}
@@ -171,37 +152,29 @@ namespace JTNE.Protocol.Extensions
/// <param name="digit">位数(8,16,32)</param>
/// <param name="ignoreUnknown">是否忽略未知数据</param>
/// <returns></returns>
public static IEnumerable<T> GetEnumTypes<T>(this int value, int digit, bool ignoreUnknown=false) where T : Enum
{
List<T> values = new List<T>();
for (int i = 0; i < digit; i++)
{
if (Math.Pow(2, i) <= value) continue;
values.Add((T)Enum.ToObject(typeof(T), (int)Math.Pow(2, i - 1)));
value = value - (int)Math.Pow(2, i - 1);
public static IEnumerable<T> GetEnumTypes<T> (this int value, int digit, bool ignoreUnknown = false) where T : Enum {
List<T> values = new List<T> ();
for (int i = 0; i < digit; i++) {
if (Math.Pow (2, i) <= value) continue;
values.Add ((T) Enum.ToObject (typeof (T), (int) Math.Pow (2, i - 1)));
value = value - (int) Math.Pow (2, i - 1);
i = 0;
if (value <= 0) break;
}
if (ignoreUnknown)
{
List<T> results = new List<T>();
foreach (var item in values)
{
foreach (string itemChild in Enum.GetNames(typeof(T)))
{
if (item.ToString() == itemChild)
{
results.Add(item);
if (ignoreUnknown) {
List<T> results = new List<T> ();
foreach (var item in values) {
foreach (string itemChild in Enum.GetNames (typeof (T))) {
if (item.ToString () == itemChild) {
results.Add (item);
break;
}
}
}
return results;
}
else
{
} else {
return values;
}
}
}
}
}

+ 23
- 29
src/JTNE.Protocol/Extensions/JTNEPackageExtensions.cs Просмотреть файл

@@ -1,15 +1,13 @@
using JTNE.Protocol.Enums;
using System;
using System;
using System.Collections.Generic;
using System.Text;
using JTNE.Protocol.Enums;

namespace JTNE.Protocol.Extensions
{
namespace JTNE.Protocol.Extensions {
/// <summary>
///
/// </summary>
public static class JTNEPackageExtensions
{
public static class JTNEPackageExtensions {
/// <summary>
///
/// </summary>
@@ -19,12 +17,11 @@ namespace JTNE.Protocol.Extensions
/// <param name="vin"></param>
/// <param name="bodies"></param>
/// <returns></returns>
public static JTNEPackage Create<TJTNEBodies>(this JTNEMsgId msgId,string vin, JTNEAskId askId, TJTNEBodies bodies)
where TJTNEBodies : JTNEBodies
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = askId.ToByteValue();
jTNEPackage.MsgId = msgId.ToByteValue();
public static JTNEPackage Create<TJTNEBodies> (this JTNEMsgId msgId, string vin, JTNEAskId askId, TJTNEBodies bodies)
where TJTNEBodies : JTNEBodies {
JTNEPackage jTNEPackage = new JTNEPackage ();
jTNEPackage.AskId = askId;
jTNEPackage.MsgId = msgId;
jTNEPackage.Bodies = bodies;
jTNEPackage.VIN = vin;
return jTNEPackage;
@@ -37,11 +34,10 @@ namespace JTNE.Protocol.Extensions
/// <param name="vin"></param>
/// <param name="askId"></param>
/// <returns></returns>
public static JTNEPackage Create(this JTNEMsgId msgId, string vin, JTNEAskId askId)
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = askId.ToByteValue();
jTNEPackage.MsgId = msgId.ToByteValue();
public static JTNEPackage Create (this JTNEMsgId msgId, string vin, JTNEAskId askId) {
JTNEPackage jTNEPackage = new JTNEPackage ();
jTNEPackage.AskId = askId;
jTNEPackage.MsgId = msgId;
jTNEPackage.VIN = vin;
return jTNEPackage;
}
@@ -55,12 +51,11 @@ namespace JTNE.Protocol.Extensions
/// <param name="askId"></param>
/// <param name="bodies"></param>
/// <returns></returns>
public static JTNEPackage CreateCustomMsgId<TJTNEBodies>(this byte msgId, string vin, JTNEAskId askId, TJTNEBodies bodies)
where TJTNEBodies : JTNEBodies
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = askId.ToByteValue();
jTNEPackage.MsgId = msgId;
public static JTNEPackage CreateCustomMsgId<TJTNEBodies> (this byte msgId, string vin, JTNEAskId askId, TJTNEBodies bodies)
where TJTNEBodies : JTNEBodies {
JTNEPackage jTNEPackage = new JTNEPackage ();
jTNEPackage.AskId = askId;
jTNEPackage.MsgId = (JTNEMsgId) msgId;
jTNEPackage.Bodies = bodies;
jTNEPackage.VIN = vin;
return jTNEPackage;
@@ -73,13 +68,12 @@ namespace JTNE.Protocol.Extensions
/// <param name="askId"></param>
/// <param name="vin"></param>
/// <returns></returns>
public static JTNEPackage CreateCustomMsgId(this byte msgId, string vin, JTNEAskId askId)
{
JTNEPackage jTNEPackage = new JTNEPackage();
jTNEPackage.AskId = askId.ToByteValue();
jTNEPackage.MsgId = msgId;
public static JTNEPackage CreateCustomMsgId (this byte msgId, string vin, JTNEAskId askId) {
JTNEPackage jTNEPackage = new JTNEPackage ();
jTNEPackage.AskId = askId;
jTNEPackage.MsgId = (JTNEMsgId) msgId;
jTNEPackage.VIN = vin;
return jTNEPackage;
}
}
}
}

+ 6
- 6
src/JTNE.Protocol/Formatters/JTNEPackageFormatter.cs Просмотреть файл

@@ -26,9 +26,9 @@ namespace JTNE.Protocol.Formatters {
JTNEPackage jTNEPackage = new JTNEPackage ();
offset += 2;
// 3.命令标识
jTNEPackage.MsgId = JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
jTNEPackage.MsgId = (JTNEMsgId)JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
// 4.应答标识
jTNEPackage.AskId = JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
jTNEPackage.AskId = (JTNEAskId)JTNEBinaryExtensions.ReadByteLittle (bytes, ref offset);
// 5.VIN
jTNEPackage.VIN = JTNEBinaryExtensions.ReadStringLittle (bytes, ref offset, 17);
// 6.数据加密方式
@@ -39,7 +39,7 @@ namespace JTNE.Protocol.Formatters {
// 8.1.根据数据加密方式进行解码
// 8.2.解析出对应数据体
if (jTNEPackage.DataUnitLength > 0) {
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId (jTNEPackage.MsgId);
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId ((byte)jTNEPackage.MsgId);
if (jTNEBodiesImplType != null) {
int bodyReadSize = 0;
try {
@@ -76,9 +76,9 @@ namespace JTNE.Protocol.Formatters {
// 2.起始符2
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, value.BeginFlag2);
// 3.命令标识
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, value.MsgId);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, (byte)value.MsgId);
// 4.应答标识
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, value.AskId);
offset += JTNEBinaryExtensions.WriteByteLittle (bytes, offset, (byte)value.AskId);
// 5.VIN
offset += JTNEBinaryExtensions.WriteStringPadRightLittle (bytes, offset, value.VIN, 17);
// 6.数据加密方式
@@ -86,7 +86,7 @@ namespace JTNE.Protocol.Formatters {
// 7.记录当前偏移量
int tmpOffset = offset;
// 8.数据体
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId (value.MsgId);
Type jTNEBodiesImplType = JTNEMsgIdFactory.GetBodiesImplTypeByMsgId ((byte)value.MsgId);
int messageBodyOffset = 0;
if (jTNEBodiesImplType != null) {
if (value.Bodies != null) {


+ 25
- 34
src/JTNE.Protocol/Internal/JTNEMsgIdFactory.cs Просмотреть файл

@@ -1,48 +1,39 @@
using JTNE.Protocol.Attributes;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Extensions;
using System;
using System;
using System.Collections.Generic;
using System.Text;
using JTNE.Protocol.Attributes;
using JTNE.Protocol.Enums;
using JTNE.Protocol.Extensions;

namespace JTNE.Protocol.Internal
{
internal static class JTNEMsgIdFactory
{
private static readonly Dictionary<byte, Type> map;
namespace JTNE.Protocol.Internal {
internal static class JTNEMsgIdFactory {
private static readonly Dictionary<byte, Type> map = new Dictionary<byte, Type> ();

static JTNEMsgIdFactory()
{
map = new Dictionary<byte, Type>();
InitMap();
static JTNEMsgIdFactory () {
InitMap ();
}

internal static Type GetBodiesImplTypeByMsgId(byte msgId) =>map.TryGetValue(msgId, out Type type) ? type : null;
internal static Type GetBodiesImplTypeByMsgId (byte msgId) => map.TryGetValue (msgId, out Type type) ? type : null;

private static void InitMap()
{
foreach(var item in Enum.GetNames(typeof(JTNEMsgId)))
{
JTNEMsgId msgId = item.ToEnum<JTNEMsgId>();
JTNEBodiesTypeAttribute jT808BodiesTypeAttribute = msgId.GetAttribute<JTNEBodiesTypeAttribute>();
map.Add((byte)msgId, jT808BodiesTypeAttribute?.JT808BodiesType);
}
private static void InitMap () {
foreach (JTNEMsgId msgId in Enum.GetValues (typeof (JTNEMsgId))) {
JTNEBodiesTypeAttribute jT808BodiesTypeAttribute = msgId.GetAttribute<JTNEBodiesTypeAttribute> ();
map.Add ((byte) msgId, jT808BodiesTypeAttribute?.JT808BodiesType);
}
}

internal static void SetMap<TJTNEBodies>(byte msgId)
where TJTNEBodies : JTNEBodies
{
if(!map.ContainsKey(msgId))
map.Add(msgId, typeof(TJTNEBodies));
internal static void SetMap<TJTNEBodies> (byte msgId)
where TJTNEBodies : JTNEBodies {
if (!map.ContainsKey (msgId))
map.Add (msgId, typeof (TJTNEBodies));
}

internal static void ReplaceMap<TJTNEBodies>(byte msgId)
where TJTNEBodies : JTNEBodies
{
if (!map.ContainsKey(msgId))
map.Add(msgId, typeof(TJTNEBodies));
internal static void ReplaceMap<TJTNEBodies> (byte msgId)
where TJTNEBodies : JTNEBodies {
if (!map.ContainsKey (msgId))
map.Add (msgId, typeof (TJTNEBodies));
else
map[msgId] = typeof(TJTNEBodies);
map[msgId] = typeof (TJTNEBodies);
}
}
}
}

+ 14
- 8
src/JTNE.Protocol/JTNEGlobalConfigs.cs Просмотреть файл

@@ -21,9 +21,9 @@ namespace JTNE.Protocol {
}

/// <summary>
/// 字符串编码,默认 GB18030
/// 字符串编码
/// </summary>
public Encoding Encoding { get; set;}
public Encoding Encoding { get; set; }

/// <summary>
///
@@ -41,35 +41,40 @@ namespace JTNE.Protocol {
/// 平台流水号
/// </summary>
public IPlatformMsgSNDistributed PlatformMsgSNDistributed { get; private set; }

/// <summary>
/// 跳过校验码
/// 测试的时候需要手动修改值,避免验证
/// 默认:false
/// </summary>
public bool SkipCRCCode { get; private set; }

/// <summary>
/// 消息数据体加密算法
/// RSA=>IJTNEEncryptImpl
/// AES=>IJTNEEncryptImpl
/// </summary>
public Func<JTNEEncryptMethod, IJTNEEncrypt> DataBodiesEncrypt { get; private set; }

/// <summary>
/// 平台登入加密算法
/// RSA=>IJTNEEncryptImpl
/// AES=>IJTNEEncryptImpl
/// </summary>
public Func<JTNEEncryptMethod, IJTNEEncrypt> PlatformLoginEncrypt { get; private set; }

/// <summary>
/// 注册自定义消息
/// </summary>
/// <typeparam name="TJTNEBodies"></typeparam>
/// <param name="msgId"></param>
/// <param name="customMsgId"></param>
/// <returns></returns>
public JTNEGlobalConfigs Register_CustomMsgId<TJTNEBodies> (byte customMsgId)
where TJTNEBodies : JTNEBodies {
JTNEMsgIdFactory.SetMap<TJTNEBodies> (customMsgId);
return instance.Value;
}

/// <summary>
/// 重写消息
/// </summary>
@@ -93,6 +98,7 @@ namespace JTNE.Protocol {
}
return instance.Value;
}
/// <summary>
///
/// </summary>
@@ -108,12 +114,12 @@ namespace JTNE.Protocol {
/// <summary>
///
/// </summary>
/// <param name="typeCode">自定义类型编码</param>
/// <param name="type">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
/// <param name="dependerId">自定义类型编码</param>
/// <param name="dependedId">继承JTNE.Protocol.MessageBody.JTNE_0x81_Body</param>
/// <returns></returns>
public JTNEGlobalConfigs Register_JTNE0x81CustomDepenedBody (byte DependerParamId, byte DependedParamId) {
if (!JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.ContainsKey (DependerParamId)) {
JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.Add (DependerParamId, DependedParamId);
public JTNEGlobalConfigs Register_JTNE0x81CustomDepenedBody (byte dependerId, byte dependedId) {
if (!JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.ContainsKey (dependerId)) {
JTNE_0x81_Body.JTNE_0x81LengthOfADependOnValueOfB.Add (dependerId, dependedId);
}
return instance.Value;
}


+ 2
- 2
src/JTNE.Protocol/JTNEPackage.cs Просмотреть файл

@@ -26,12 +26,12 @@ namespace JTNE.Protocol
/// 命令标识
/// <see cref="JTNE.Protocol.Enums.JTNEMsgId"/>
/// </summary>
public byte MsgId { get; set; }
public JTNEMsgId MsgId { get; set; }
/// <summary>
/// 应答标志
/// <see cref="JTNE.Protocol.Enums.JTNEAskId"/>
/// </summary>
public byte AskId { get; set; }
public JTNEAskId AskId { get; set; }
/// <summary>
/// 车辆识别码
/// </summary>


+ 24
- 34
src/JTNE.Protocol/JTNESerializer.cs Просмотреть файл

@@ -1,52 +1,42 @@
using JTNE.Protocol.Extensions;
using System;
using System;
using System.Runtime.CompilerServices;
using JTNE.Protocol.Extensions;

[assembly: InternalsVisibleTo("JTNE.Protocol.Test")]
[assembly : InternalsVisibleTo ("JTNE.Protocol.Test")]

namespace JTNE.Protocol
{
namespace JTNE.Protocol {
/// <summary>
///
/// </summary>
public static class JTNESerializer
{
public static byte[] Serialize(JTNEPackage jTNEPackage, int minBufferSize = 256)
{
return Serialize<JTNEPackage>(jTNEPackage, minBufferSize);
public static class JTNESerializer {
public static byte[] Serialize (JTNEPackage jTNEPackage, int minBufferSize = 256) {
return Serialize<JTNEPackage> (jTNEPackage, minBufferSize);
}

public static JTNEPackage Deserialize(ReadOnlySpan<byte> bytes)
{
return Deserialize<JTNEPackage>(bytes);
public static JTNEPackage Deserialize (ReadOnlySpan<byte> bytes) {
return Deserialize<JTNEPackage> (bytes);
}

public static byte[] Serialize<T>(T obj, int minBufferSize = 256)
{
var formatter = JTNEFormatterExtensions.GetFormatter<T>();
byte[] buffer = JTNEArrayPool.Rent(minBufferSize);
try
{
var len = formatter.Serialize(ref buffer, 0, obj);
return buffer.AsSpan(0, len).ToArray();
}
finally
{
JTNEArrayPool.Return(buffer);
public static byte[] Serialize<T> (T obj, int minBufferSize = 256) {
var formatter = JTNEFormatterExtensions.GetFormatter<T> ();
byte[] buffer = JTNEArrayPool.Rent (minBufferSize);
try {
var len = formatter.Serialize (ref buffer, 0, obj);
return buffer.AsSpan (0, len).ToArray ();
} finally {
JTNEArrayPool.Return (buffer);
}
}

public static T Deserialize<T>(ReadOnlySpan<byte> bytes)
{
var formatter = JTNEFormatterExtensions.GetFormatter<T>();
public static T Deserialize<T> (ReadOnlySpan<byte> bytes) {
var formatter = JTNEFormatterExtensions.GetFormatter<T> ();
int readSize;
return formatter.Deserialize(bytes,out readSize);
return formatter.Deserialize (bytes, out readSize);
}

public static dynamic Deserialize(ReadOnlySpan<byte> bytes,Type type)
{
var formatter = JTNEFormatterExtensions.GetFormatter(type);
return JTNEFormatterResolverExtensions.JTNEDynamicDeserialize(formatter,bytes,out int readSize);
public static dynamic Deserialize (ReadOnlySpan<byte> bytes, Type type) {
var formatter = JTNEFormatterExtensions.GetFormatter (type);
return JTNEFormatterResolverExtensions.JTNEDynamicDeserialize (formatter, bytes, out int readSize);
}
}
}
}

Загрузка…
Отмена
Сохранить