Hazelcast支持团队成员告诉我,我需要使用IPortable实现才能在Map.Values()中使用IPredicate查询。
我可以成功地将值映射到地图中,并使用Map.Values()
获取所有值。请参阅下面的示例代码。
但是,当我尝试使用SqlPredicate查询Map.Values()时,我收到错误消息:
“Hazelcast.Net.dll中发生了'Hazelcast.Core.QueryException类型的未处理异常'。附加信息:java.lang.IllegalStateException:流中的字段数[2]与ClassDefinition {factoryId = 1,classId不匹配= 1,版本= 0,fieldDefinitions = [FieldDefinitionImpl {index = 0,fieldName ='Name',type = UTF,...“
我的配置:
var clientConfig = new ClientConfig();
clientConfig.GetNetworkConfig().AddAddress(hazelCastIpAddress);
clientConfig.SetGroupConfig(new GroupConfig(groupId, password));
clientConfig.GetSerializationConfig().AddPortableFactory(MyDataSerializableFactory.FactoryId, new MyDataSerializableFactory());
我的Hazelcast存储库:
private IHazelcastInstance _hazelcastClient;
public IMap<object, TEntity> Map { get; }
public HazelCastRepository(IHazelcastInstance hazelcastClient)
{
_hazelcastClient = hazelcastClient;
Map = hazelcastClient.GetMap<object, TEntity>(typeof(TEntity).Name);
}
public void Create(TEntity entity)
{
Map.Set(entity.MapKey, entity); // map sets correctly with MapKey
}
public ICollection<TEntity> Get(string where)
{
var x = Map.Values(); // get all values and it works properly
var y = new EqualPredicate("Id", 6);
return Map.Values(y); // code breaks here with an error java.lang.IllegalStateException bla bla...
}
IPortableFactory实现:
public class MyDataSerializableFactory : IPortableFactory
{
public const int FactoryId = 1;
public IPortable Create(int classId)
{
var type = HazelcastContext.Models[classId];
var instance = Activator.CreateInstance(type);
return (IPortable)instance;
}
}
public class HazelcastContext
{
public static Dictionary<int, Type> Models = new Dictionary<int, Type>() {
{ 1, typeof(MyTestModel)},
{ 2, typeof(MySecondTestModel) }
};
}
我的对象类:
public class MyTestModel: IPortable
{
public string Name { get; set; }
public long Id { get; set; }
public Guid MapKey
{
get; set;
} = Guid.NewGuid();
public int GetClassId()
{
return 1;
}
public int GetFactoryId()
{
return 1;
}
public void ReadPortable(IPortableReader reader)
{
Name = reader.ReadUTF("Name");
Id = reader.ReadLong("Id");
}
public void WritePortable(IPortableWriter writer)
{
writer.WriteUTF("Name", Name);
writer.WriteLong("Id", Id);
}
}
答案 0 :(得分:0)
那些来错误的错误,我有解决这个问题的方法。
我通过他们的gitter.im房间联系了hazelcast的支持团队并提出了一些建议,但这对我没有帮助。 Mastering Hazelcast IMDB中有一段说:
getFactoryId 应返回唯一的正数,而 getId 应在其对应的
PersonDataSerializableFactory
内返回唯一的正数。因此,只要 getFactoryId 不同,IdentifiedDataSerializable
实现就可以返回相同的ID。
所以,问题是 factoryId 。如果您遇到这样的错误,请清除hazelcast上的数据并更改您使用的 factoryId 。然后,hazelcast会做到这一点。
我相信这是因为我做了很多关于淡褐色的测试,因为它非常“脆弱”,不知何故她感到困惑。