【发布时间】:2016-09-07 15:11:49
【问题描述】:
我在有状态服务结构应用程序中使用可靠队列。 当我试图将一个项目入队时,入队方法抛出异常
使用的代码是
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 上,它正在抛出异常
使用数据合约名称键入“TestService.CreateCommand” 'CreateCommand:http://schemas.datacontract.org/2004/07/TestService' 是 没想到。如果您正在使用,请考虑使用 DataContractResolver DataContractSerializer 或添加任何静态未知的类型到 已知类型的列表 - 例如,通过使用 KnownTypeAttribute 属性或通过将它们添加到传递给 序列化器。
堆栈跟踪
在 System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract、XmlWriterDelegator xmlWriter、对象 obj、布尔值 verifyKnownType,RuntimeTypeHandle 声明的TypeHandle,类型 声明类型)在 System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, 对象 obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter 作家,对象图)在 Microsoft.ServiceFabric.Replicator.DataContractStateSerializer
1.Write(T value, BinaryWriter binaryWriter) at System.Fabric.Store.TStore5.GetValueBytes(TValue currentValue, TValue newValue) 在 System.Fabric.Store.TStore5.<AddAsync>d__4.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.ServiceFabric.Data.Collections.DistributedQueue1.d__9.MoveNext() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
在 TestService.TestService.d__2.MoveNext() 中 D:\Projects\Local\ReliableSerialization\Application1\TestService\TestService.cs:line 51 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.ServiceFabric.Services.Runtime.StatefulServiceReplicaAdapter.d__f.MoveNext()
当我将代码更改为使用具体类型时,它运行良好。
在我的情况下IReliableQueue<CreateCommand>
效果很好。
【问题讨论】:
-
DataContractSerializer序列化具体类型而不是接口。看看Serializing a List of Interfaces using the DataContractSerializer。
标签: c# serialization azure-service-fabric service-fabric-stateful