c# - 类型不是预期的,并且无法使用 protobuf-net 的 .NET 预定义类推断出任何契约

标签 c# asp.net .net protobuf-net

我有一个 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

enter image description here

我知道 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/

相关文章:

c# - 从括号表示法中的查询字符串绑定(bind)模型

c# - Entity Framework - 处置后的 _objectTypeCount

c# - WPF TreeView : Why does virtualizing break BringIntoView()?

.net - 防止按 alt 键选择菜单条

.net - 如何在 Entity Framework 中实现真正的一对一关系?

c# - ASP.NET Core 属性路由

c# - 省略 Void 一词是否与包含 Void 相同?

c# - 如何在 EF Core Code First 中自定义迁移生成?

javascript - javascript popupwindow 之后的行如何工作?

c# - 如何在 C# ASP.NET (VS 2010) 中包含另一个 Web 文件