- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的有状态服务结构应用程序中使用可靠队列。当我尝试将一个项目入队时,入队方法抛出异常
使用的代码是
protected override async Task RunAsync(CancellationToken cancellationToken)
{
ICommand myItem = new CreateCommand()
{
Data = "Sample Data",
Id = Guid.NewGuid(),
TenentName = "SampleTenant"
};
var myQueue = await this.StateManager.GetOrAddAsync<IReliableQueue<ICommand>>("CommandQueue");
using (var tx = StateManager.CreateTransaction())
{
await myQueue.EnqueueAsync(tx, myItem, TimeSpan.FromSeconds(4), cancellationToken);
await tx.CommitAsync();
}
using (var tx = StateManager.CreateTransaction())
{
var dq = await myQueue.TryDequeueAsync(tx);
await tx.CommitAsync();
}
}
}
public interface ICommand
{
Guid Id { get; set; }
string TenentName { get; set; }
}
public class CreateCommand : ICommand
{
public Guid Id { get; set; }
public string TenentName { get; set; }
public string Data { get; set; }
}
在 myQueue.EnqueueAsync 上,它抛出异常
Type 'TestService.CreateCommand' with data contract name 'CreateCommand:http://schemas.datacontract.org/2004/07/TestService' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.
堆栈跟踪
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph) at Microsoft.ServiceFabric.Replicator.DataContractStateSerializer
1.Write(T
5.GetValueBytes(TValue currentValue, TValue newValue) at System.Fabric.Store.TStore
value, BinaryWriter binaryWriter) at
System.Fabric.Store.TStore5.<AddAsync>d__4.MoveNext()
1.d__9.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task
task) at
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
task) at
Microsoft.ServiceFabric.Data.Collections.DistributedQueue
at TestService.TestService.d__2.MoveNext() in D:\Projects\Local\ReliableSerialization\Application1\TestService\TestService.cs:line 51 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.ServiceFabric.Services.Runtime.StatefulServiceReplicaAdapter.d__f.MoveNext()
当我更改代码以使用具体类型时,它工作正常。
以我为例 IReliableQueue<CreateCommand>
它运行良好。
最佳答案
您的类型缺少 DataContract 和 DataMember 属性,并且由于数据协定序列化工作方式的实现,您不能将 DataContract 属性放在接口(interface)上。缺少数据协定属性可能导致难以追踪错误,因为 Service Fabric 将在内部存储对对象的引用并在您出列时返回该引用,但在提交时将对象发送到辅助对象时序列化该对象。当您忘记上述属性时,您会看到它有时似乎可以工作,但要么会抛出提交事务,要么您将拥有看似良好的填充对象,直到服务重新启动(对于升级,如果该节点去下来,或其他一些原因)然后将是空的(缺少属性的字段将为空/默认)。
要在数据协定中利用多态性,您可以使用基类和 KnownType 属性。这就是您的示例在添加删除命令后的样子。
[DataContract]
[KnownType(typeof(CreateCommand))]
[KnownType(typeof(DeleteCommand))]
public class BaseCommand
{
[DataMember]
public Guid Id { get; set; }
[DataMember]
public string TenentName { get; set; }
}
[DataContract]
public class CreateCommand : BaseCommand
{
[DataMember]
public string Data { get; set; }
}
[DataContract]
public class DeleteCommand : BaseCommand
{
[DataMember]
public string SomeOtherData { get; set; }
}
另请注意,已知类型属性支持传入函数以编程方式发现子类型,但请勿使用它,因为它会以奇怪且难以诊断的方式破坏可升级性。
关于c# - IReliableQueue 入队序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39343161/
这似乎是一个非常基本的问题,但我已经被困了几个小时。 我们什么时候使用 enqueue/dequeue 方法,什么时候使用 offer/poll?! 我想用 void enqueue(int x, i
我正在制作一款格斗游戏,我正在尝试保留玩家输入的 Action 队列。出于某种原因,我无法将我的字符串添加到队列中。 moverecorder.Enqueue(instructions); "inst
我想公开一个公共(public) RESTful API,并配置我们的 ActiveMQ 实例(可能)来监听该 API 并自动将这些 API 调用的 JSON 或 XML 版本排入队列,或者配置/编写
当我调用我的 API 之一时,onRespone 方法返回空 response.body()。我以前多次遵循这种方式并且它有效,但在这种情况下不起作用。此 api 也适用于浏览器。 我检查了所有的东西
我希望实现 Queue类型 Dictionary并能够迭代/入队/出队。 最终需要的是 queue的 int , string ,无论采取何种伪装。 到目前为止,我有类似的东西: private
错误是什么意思? { [Error: Cannot enqueue Query after fatal error.] code: 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERRO
上面发生了什么: 从接收到的用户数据数组初始化 Realm 模型。 在后台线程的 Realm 数据库中一次写入所有模型。 如果 Realm 模型已通过创建副本存在,则会对其进行更新。 任何人都可以在这
我是一名优秀的程序员,十分优秀!