2017-08-21 1 views
0

Geodeで非常に簡単なPDX自動開始を実装しようとしています。私は0のargコンストラクタで私自身のドメインクラスを作成しました:タイプレジストリにPDXタイプをGeode C#ネイティブクライアントに登録する

public class TestPdx 
{ 
    public string Test1 { get; set; } 
    public string Test2 { get; set; } 
    public string Test3 { get; set; } 

    public TestPdx() { } 
} 

今このクラスを自動直列化します。私は、自動PDXのため、このタイプを登録しようとすると、次のcache.xmlとサーバーのキャッシュを開始します。

<?xml version="1.0" encoding="UTF-8"?> 
<cache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://geode.apache.org/schema/cache" 
xsi:schemaLocation="http://geode.apache.org/schema/cache 
http://geode.apache.org/schema/cache/cache-1.0.xsd" 
version="1.0"> 
<cache-server/> 
<pdx> 
<pdx-serializer> 
    <class-name>org.apache.geode.pdx.ReflectionBasedAutoSerializer</class-name> 
    <parameter name="classes"><string>TestPdx</string></parameter> 
</pdx-serializer> 
</pdx> 
<region name="webclient" refid="REPLICATE_PERSISTENT"/> 
</cache> 

し、次のコードを実行します。このコードは、行でクラッシュし

static void Main(string[] args) 
{ 
    // 1. cache 
    CacheFactory cacheFactory = CacheFactory.CreateCacheFactory(); 
    Cache cache = cacheFactory 
     .SetSubscriptionEnabled(true) 
     .SetPdxReadSerialized(true) 
     .Create(); 

    Serializable.RegisterPdxSerializer(new ReflectionBasedAutoSerializer()); 

    RegionFactory regionFactory = cache.CreateRegionFactory(RegionShortcut.CACHING_PROXY); 
    IRegion<string, TestPdx> region = regionFactory.Create<string, TestPdx>("webclient"); 

    // 3. TestPx object 
    TestPdx t = new TestPdx(); 
    t.Test1 = "test1"; 
    t.Test2 = "test2"; 
    t.Test3 = "test3"; 

    region["1"] = t; 

    // 4. Get the entries 
    TestPdx result1 = region["1"]; 

    // 5. Print result 
    Console.WriteLine(result1.Test1); 
    Console.WriteLine(result1.Test2); 
    Console.WriteLine(result1.Test3); 
} 

region["1"] = t;エラーあり

GFCLI_EXCEPTION:System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception. 
at apache.geode.client.SerializationRegistry.GetPDXIdForType(SByte* , SharedPtr<apache::geode::client::Serializable>*) 

私はPDXタイプを正しく登録していません。ネイティブクライアントではどうしますか?

THANKS

+0

私は同じエラーがhttps://github.com/クイックスタートの例を実行し得ますapache/geode-native/blob/develop/quickstart/csharp/PdxInstance.cs – rupweb

答えて

0

がここで答えは次のようにTestPdxIPdxSerializableを実装することです:

public class TestPdx : IPdxSerializable 
{ 
    public string Test1 { get; set; } 
    public string Test2 { get; set; } 
    public string Test3 { get; set; } 
    public int Pid { get; set; } 

    public void ToData(IPdxWriter writer) 
    { 
     writer.WriteString("Test1", Test1); 
     writer.WriteString("Test2", Test2); 
     writer.WriteString("Test3", Test3); 
     writer.WriteInt("Pid", Pid); 
     writer.MarkIdentityField("Pid"); 
    } 

    public void FromData(IPdxReader reader) 
    { 
     Test1 = reader.readString("Test1"); 
     Test2 = reader.readString("Test2"); 
     Test3 = reader.readString("Test3"); 
     Pid = reader.readInt("Pid"); 
    } 

    public static IPdxSerializable CreateDeserializable() 
    { 
     return new TestPdx(); 
    } 

    public TestPdx() { } 
} 

をし、その後のGeodeでのPDXタイプを登録し、タイプobject領域を使用するか、TestPdxなどを入力次のようになります。

Serializable.RegisterPdxType(TestPdx.CreateDeserializable); 
IRegion<string, Object> t = regionFactory.Create<string, Object>("test"); 

そして、TestPdxを領域simp LY:など

TestPdx value = new TestPdx(); 
value.Test1 = "hello"; 
value.Test2 = "world"; 
value.Test3 = "again"; 
t[key] = value; 

、あなたがそれにOQLクエリを実行できるようにするGeode領域にPdxInstanceがあるだろう、

関連する問題