Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尽可能紧凑地序列化结构_C#_Unity3d_Serialization - Fatal编程技术网

C# 尽可能紧凑地序列化结构

C# 尽可能紧凑地序列化结构,c#,unity3d,serialization,C#,Unity3d,Serialization,我想为多人游戏序列化和反序列化各种结构。我目前正在使用unity的json序列化: public static T GetObject<T>(byte[] bytes) { T t = JsonUtility.FromJson<T>(encoding.GetString(bytes)); return t; } public static byte[] GetBytes(object obj) { stri

我想为多人游戏序列化和反序列化各种结构。我目前正在使用unity的json序列化:

public static T GetObject<T>(byte[] bytes) {
        T t = JsonUtility.FromJson<T>(encoding.GetString(bytes));
        return t;
    }

    public static byte[] GetBytes(object obj) {
        string json = JsonUtility.ToJson(obj);
        return encoding.GetBytes(json);
    }

protobuf net可能是一种选择;根据问题中的例子,这可能是:

[协议]
结构A
{
[原成员(1)]
公共向量3位置;
[原成员(2)]
公共字符串名称;
}
[原始合同]
结构B
{
[原成员(1)]
公共uint id;
[原成员(2)]
公众A[]实例;
}
使用类似于:

静态类P
{
静态void Main()
{
//Vector3可能是一个数字,因为它不适合任何正常模式;调整它。。。
//(只需在项目早期某处执行一次)
RuntimeTypeModel.Default.Add(typeof(Vector3),false)
.Add(nameof(Vector3.x)、nameof(Vector3.y)、nameof(Vector3.z));
//测试对象
var原始=新B{
id=42,
示例=新[]{
新的{
位置=新矢量3(1,2,3),
name=“abc”
}
}
};
var ms=新内存流();
//连载
序列化器。序列化(ms,原始);
//显示十六进制(通常你不会这么做-你只需要使用二进制
WriteLine(BitConverter.ToString(ms.GetBuffer(),0,(int)ms.Length));
//反序列化(记住MemoryStream需要重绕)
ms.Position=0;
var b=序列化程序。反序列化(ms);
控制台写入线(b.id);
var a=b.examples.Single();
Console.WriteLine(a.name);
控制台写入线(a.position.x);
控制台写入线(a位置y);
控制台写入线(a.position.z);
}
}
对于相同的负载,通过
JsonConvert.SerializeObject
,我得到了26个字节,而不是74个字节的UTF-8


您可能希望在有或没有为
Vector3
自定义设置步骤的情况下都尝试它。另外注意:如果您使用AOT,则执行运行时元编程的任何工具都可能会出现一些问题,protobuf net广泛使用这些工具。但设置它以在您的环境中测试它相对容易,至少!

pro托福网可能是一种选择;鉴于问题中的示例,这可能是:

[协议]
结构A
{
[原成员(1)]
公共向量3位置;
[原成员(2)]
公共字符串名称;
}
[原始合同]
结构B
{
[原成员(1)]
公共uint id;
[原成员(2)]
公众A[]实例;
}
使用类似于:

静态类P
{
静态void Main()
{
//Vector3可能是一个数字,因为它不适合任何正常模式;调整它。。。
//(只需在项目早期某处执行一次)
RuntimeTypeModel.Default.Add(typeof(Vector3),false)
.Add(nameof(Vector3.x)、nameof(Vector3.y)、nameof(Vector3.z));
//测试对象
var原始=新B{
id=42,
示例=新[]{
新的{
位置=新矢量3(1,2,3),
name=“abc”
}
}
};
var ms=新内存流();
//连载
序列化器。序列化(ms,原始);
//显示十六进制(通常你不会这么做-你只需要使用二进制
WriteLine(BitConverter.ToString(ms.GetBuffer(),0,(int)ms.Length));
//反序列化(记住MemoryStream需要重绕)
ms.Position=0;
var b=序列化程序。反序列化(ms);
控制台写入线(b.id);
var a=b.examples.Single();
Console.WriteLine(a.name);
控制台写入线(a.position.x);
控制台写入线(a位置y);
控制台写入线(a.position.z);
}
}
对于相同的负载,通过
JsonConvert.SerializeObject
,我得到了26个字节,而不是74个字节的UTF-8


您可能想在有或没有为
Vector3
自定义设置步骤的情况下尝试它。另外注意:如果您使用AOT,任何执行运行时元编程的工具都可能会遇到一些问题,protobuf net广泛使用这些工具。但是设置它以在您的环境中测试它相对容易,至少!

结构看起来像吗?你能添加属性吗?protobuf在很多情况下都能很好地工作,protobuf net通常只需添加一些属性就可以很容易地改装到现有类型上;如果你有一个结构示例的话,我可以更具体一些是的,我可以添加属性,我将研究protobuf。我可以给出一些示例结构,但我希望能够随着时间的推移添加更多结构。(随着时间的推移添加更多)我明白这一点;我只是想a:衡量它的适用性,b:帮助你入门我添加了一个例子嗨,两个问题:-你需要使用json的原因是什么-我问你如何计划在客户端和服务器之间传输,因为有很多选项可以让它更好,比如zipstreaming json字符串which将很容易,从Web服务器压缩回复,这将根本不起作用,到BSON或protobuf,我理解你不想使用普通的C#内置序列化,或者这是一个选项?等等。结构看起来像什么?你能添加属性吗?protobuf在许多情况下工作得很好,protobuf net通常是easy只需添加一些属性即可对现有类型进行改造;如果您有一个结构示例,我可能会更具体一些是的,我可以添加属性,我将研究protobuf。我可以给出一些示例结构,但我希望能够随着时间的推移添加更多结构。(随着时间的推移添加更多)我明白;我只是想a:评估它的适用性,b:帮助你开始我添加了一个例子嗨,两个问题:-
struct A {
    Vector3 position;
    string name;
}
struct B {
    uint id;
    A[] examples;
}