c# (ENUM)枚举组合类型的谷歌序列化Protobuf

简介:

c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面:

RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru = true;

[ProtoContract]
class LbsItem
{
[ProtoMember(1)]
public Alarm alarm
{
get; set;
}
}

public enum Alarm : byte
{
无报警,
碰撞 = 1 << 0,
振动 = 1 << 1,
超速 = 1 << 2,
}

public class ProtobufHelper
{
static ProtobufHelper()
{
RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru = true;
}
/// <summary>
/// 序列化
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="t">对象</param>
/// <returns>序列化后的字符串</returns>
public static string Serialize<T>(T t)
{
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<T>(ms, t);
return Convert.ToBase64String(ms.ToArray());
}
}

/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="content">字符串</param>
/// <returns>反序列化后的对象</returns>
public static T DeSerialize<T>(string content)
{
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(content)))
{
T t = Serializer.Deserialize<T>(ms);
return t;
}
}
}

示例:

Alarm alarm = Alarm.振动 | Alarm.碰撞;

LbsItem item = new Demo.LbsItem();
item.alarm = alarm;

var serValue= ProtobufHelper.Serialize<LbsItem>(item);
var _item = ProtobufHelper.DeSerialize<LbsItem>(serValue);




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/6208072.html,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
|
2月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
2月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
48 0
|
2月前
|
安全 API C#
C#.Net筑基-类型系统②常见类型--枚举Enum
枚举(enum)是C#中的一种值类型,用于创建一组命名的整数常量。它们基于整数类型(如int、byte等),默认为int。枚举成员可指定值,未指定则从0开始自动递增。默认值为0。枚举可以与整数类型互相转换,并可通过`[Flags]`特性表示位域,支持位操作,用于多选场景。`System.Enum`类提供了如`HasFlag`、`GetName`等方法进行枚举操作。
|
2月前
|
编译器 C#
C#.Net筑基-类型系统②常见类型 --record是什么类型?
`record`在C#中是一种创建简单、只读数据结构的方式,常用于轻量级数据传输。它本质上是类(默认)或结构体的快捷形式,包含自动生成的属性、`Equals`、`ToString`、解构赋值等方法。记录类型可以继承其他record或接口,但不继承普通类。支持使用`with`语句创建副本。例如,`public record User(string Name, int Age)`会被编译为包含属性、相等比较和`ToString()`等方法的类。记录类型提供了解构赋值和自定义实现,如密封的`sealed`记录,防止子类重写。
|
2月前
|
存储 C#
C#.Net筑基-类型系统②常见类型--结构体类型Struct
本文介绍了C#中的结构体(struct)是一种用户自定义的值类型,适用于定义简单数据结构。结构体可以有构造函数,能定义字段、属性和方法,但不能有终结器或继承其他类。它们在栈上分配,参数传递为值传递,但在类成员或包含引用类型字段时例外。文章还提到了`readonly struct`和`ref struct`,前者要求所有字段为只读,后者强制结构体存储在栈上,适用于高性能场景,如Span和ReadOnlySpan。
|
2月前
|
存储 安全 Unix
C#.Net筑基-类型系统②常见类型--日期和时间的故事
在System命名空间中,有几种表示日期时间的不可变结构体(Struct):DateTime、DateTimeOffset、TimeSpan、DateOnly和TimeOnly。DateTime包含当前本地或UTC时间,以及最小和最大值;DateTimeOffset增加了时区偏移信息,适合跨时区操作。UTC是世界标准时间,而格林尼治标准时间(GMT)不稳定,已被更精确的UTC取代。DateTimeOffset和DateTime提供了转换为UTC和本地时间的方法,以及各种解析和格式化函数。
|
2月前
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
46 0
|
2月前
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例
|
2月前
|
存储 C# 开发者
C#变量类型
C#变量类型
30 0