.net 奥尔良私有财产反序列化

4si2a6ki  于 2022-11-26  发布在  .NET
关注(0)|答案(2)|浏览(117)

bounty将在2天后过期。回答此问题可获得+50声望奖励。Murdock希望吸引更多人关注此问题。

我有一个有状态的颗粒的奥尔良项目。
奥尔良似乎没有取消私有财产时,补水的粮食国家。
在下图中,UserId被反序列化,但State未被反序列化。
有什么办法可以解决这个问题吗?

7xzttuei

7xzttuei1#

您可以重写默认的GrainStorageSerializer以使用System.Text.Json,这允许在将JsonInclude特性应用于具有私有setter的属性时反序列化该属性,如下所示。

public class Order
{
    [JsonInclude]
    public OrderStates State{ get; private set; }
}

然后,您可以在配置环境时执行以下设置。实现使用System.Text.JsonIGrainStorageSerializer版本。在下面的示例中,我创建了实现接口的SystemTextJsonSerializer

public class SystemTextJsonSerializer : IGrainStorageSerializer
{
    public BinaryData Serialize<T>(T input)
    {
        return new BinaryData(JsonSerializer.SerializeToUtf8Bytes(input));
    }

    public T Deserialize<T>(BinaryData input)
    {
        return input.ToObjectFromJson<T>();
    }
}

然后,您可以按如下方式配置GrainStorageSerializer

siloBuilder.Services.AddSerializer(serializerBuilder =>
    {
        serializerBuilder.AddJsonSerializer(isSupported: type => type.Namespace.StartsWith("Example.Domain"));
    });
        
.AddAzureTableGrainStorage(
    name: "OrleansProvider",
    configureOptions: options =>
    {
        options.GrainStorageSerializer = new SystemTextJsonSerializer();
        options.ConfigureTableServiceClient("...");
    });
m3eecexj

m3eecexj2#

您可以将颗粒的状态设置为具有公共属性的单独的可序列化对象,并让Orleans将其作为IPersistentState注入到颗粒的构造函数中,如 * 入门 * 部分中Microsoft Learn上的颗粒持久性中所述。
请记住,不能在颗粒的构造函数中使用实际的状态数据。
如果需要在第一条消息被调度到粒度之前使用状态数据进行额外的内务处理,则实现OnActivateAsync

相关问题