我有一个 System.Globalization.CultureInfo 集合的缓存我的 Context 包装类中的类
public Collection<System.Globalization.CultureInfo> Cultures
{
get
{
// Get the value from Redis cache
}
set
{
// Save the value into Redis cache
}
}
可以通过MyContextWrapper.Current.Cultures访问它。
当我使用 protobuf-net 序列化“Collection Cultures”的值时,出现以下错误:
类型不是预期的,无法推断出任何契约(Contract):System.Globalization.CultureInfo
我知道 protobuf-net 需要在类上进行 [ProtoContract] 和 [ProtoMember] 装饰,但这仅适用于自定义用户定义的类。
我如何使用 .NET 预定义类,例如我的例子中的 System.Globalization.CultureInfo。
这对于 protobuf-net 来说是可能的吗?
最佳答案
你可以和代理人一起去。在序列化集合之前通知 protobuf-net。虽然我现在所拥有的仅适用于内置文化,但您可以自行扩展以添加额外的数据以完全恢复文化。
示例
将 CultureInfo 转换为 protobuf-net 支持类型的代理。
[ProtoContract]
public class CultureInfoSurrogate
{
[ProtoMember(1)]
public int CultureId { get; set; }
public static implicit operator CultureInfoSurrogate(CultureInfo culture)
{
if (culture == null) return null;
var obj = new CultureInfoSurrogate();
obj.CultureId = culture.LCID;
return obj;
}
public static implicit operator CultureInfo(CultureInfoSurrogate surrogate)
{
if (surrogate == null) return null;
return new CultureInfo(surrogate.CultureId);
}
}
将其放在程序开头的某个位置(至少在序列化集合之前):
RuntimeTypeModel.Default.Add(typeof(CultureInfo), false).SetSurrogate(typeof(CultureInfoSurrogate));
如果您还有其他问题,请在评论中告诉我。
关于c# - 类型不是预期的,并且无法使用 protobuf-net 的 .NET 预定义类推断出任何契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781544/