Comments (3)
@defilerc I've opened #8993 with a fix. I assume you will need this backported to v7.x
from orleans.
This does seem like a bug to me. Thanks for reporting. I'm investigating.
For now, here are some workarounds:
- Make the constructor private and add a static method to create instances. This hides the ctor from the serializer.
using Orleans;
using Orleans.Serialization;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using NUnit.Framework.Legacy;
var serviceProvider = new ServiceCollection()
.AddSerializer()
.BuildServiceProvider();
var serializer = serviceProvider.GetRequiredService<Serializer>();
var instance = MatchStatistics.Create();
var bytes = serializer.SerializeToArray(instance);
var deserialized = serializer.Deserialize<MatchStatistics>(bytes);
CollectionAssert.AreEquivalent(instance, deserialized);
[GenerateSerializer]
public class MatchStatistics : Dictionary<IncidentType, int[]>
{
public static MatchStatistics Create() => new();
private MatchStatistics()
{
this[IncidentType.Score] = new[] { 0, 0 };
}
}
[GenerateSerializer]
public enum IncidentType { Unknown = 0, Score = 1 }
- Define a custom activator for the
MatchStatistics
class which avoids the dictionary mutation and add the[UseActivator]
attribute to theMatchStatistics
class
using Orleans;
using Orleans.Serialization;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using NUnit.Framework.Legacy;
using Orleans.Serialization.Activators;
var serviceProvider = new ServiceCollection()
.AddSerializer()
.BuildServiceProvider();
var serializer = serviceProvider.GetRequiredService<Serializer>();
var instance = new MatchStatistics();
var bytes = serializer.SerializeToArray(instance);
var deserialized = serializer.Deserialize<MatchStatistics>(bytes);
CollectionAssert.AreEquivalent(instance, deserialized);
[GenerateSerializer]
[UseActivator]
public class MatchStatistics : Dictionary<IncidentType, int[]>
{
public MatchStatistics() : this(true)
{
}
internal MatchStatistics(bool addDefaults)
{
if (addDefaults)
{
this[IncidentType.Score] = new[] { 0, 0 };
}
}
}
[RegisterActivator]
public sealed class MatchStatisticsActivator : IActivator<MatchStatistics>
{
public MatchStatistics Create() => new MatchStatistics(addDefaults: false);
}
[GenerateSerializer]
public enum IncidentType { Unknown = 0, Score = 1 }
Option 1 is less code. Option 2 does not require you to change call sites or break binary compatibility.
from orleans.
@ReubenBond thx a lot for your prompt reply and fix! If that's possible, that would be great, as we're migrating to Orleans v7.x at the moment and will migrate to .NET8/Orleans 8.X at a later stage.
from orleans.
Related Issues (20)
- how do i change in AdoNetClusteringSiloOptions, dbo schema
- Race condition in PersistentStreamPullingAgent can cause events to get dropped when using SimpleQueueCache HOT 5
- [BUG/Feature Request] Serialization: Converters that convert to base types
- Orleans Node Interleaved Upgrade Causes Placement Strategy Not to Update
- Stale Records in Dynamo DB
- PersistentState and IPersistentState require to reference Microsoft.Orleans.Runtime
- Orleans streams fail to deliver messages on silo1 after silo2 shutdown HOT 7
- using PersistentState with Redis provider could cause an error if data is loss. HOT 1
- Orleans Message Rejection Exception on Azure: Unable to Connect to Silo Endpoint
- Azure Blob storage provider has fixed json extension
- Tests relied on `FakeTimeProvider` failed after upgrading to orleans 8.2.0 HOT 4
- Log error should be changed to warning when client starts faster than server
- Allow specifying to use the real environment statistics provider in `TestingHost`
- Issue with missing grain reference when retrieving all reminders
- Multiple grain exceptions lead to deadlock HOT 6
- The call order of await is not used? HOT 2
- Changed BankServer Example to Use Azure Table Storage - Exceptions HOT 1
- AdoNetGrainStorage HashPicker customization support
- Can an exception be thrown if the processing time on the timer is too long๏ผ HOT 4
- InvokeCallbackAsync latency HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ๐๐๐
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from orleans.