2017-08-21 2 views
0

Ich versuche, eine sehr einfache PDX-Autoserialisierung in Geode zu implementieren. Ich habe eine Domain-Klasse meiner eigenen mit einem Null-arg Konstruktor erstellt:Registrieren von PDX-Typ in der Typ-Registrierung mit Geode C# nativen Client

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

    public TestPdx() { } 
} 

Jetzt möchte ich diese Klasse Auto serialize. Ich fange an einen Server-Cache mit dem folgenden cache.xml, wo ich versuchen, diese Art für Auto PDX zu registrieren:

<?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> 

und führen Sie dann den folgenden Code ein:

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); 
} 

Dieser Code in Zeile stürzt region["1"] = t; mit Fehler

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>*) 

So habe ich den PDX-Typ nicht richtig registriert. Wie machst du das mit nativem Client?

DANK

+0

ich die gleichen Fehler der Schnellstart-Beispiel läuft https://github.com/ apache/geode-native/blob/entwickeln/quickstart/csharp/PdxInstance.cs – rupweb

Antwort

0

Eine Antwort hier ist IPdxSerializable im TestPdx zu implementieren, wie folgt:

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() { } 
} 

und dann PDX-Typ in der Geode, und verwenden Sie einen Bereich von object oder Typ Typ registrieren TestPdx als folgt:

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

und die TestPdx in die Region zu schreiben einfa ly:

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

und es wird eine PdxInstance im Geode-Region, so dass Sie OQL Abfragen darauf laufen können usw.

Verwandte Themen