2016-03-13 46 views
3

我有一些數據將被存儲到塞對列數據存儲到塞

假設進來的數據是

["A", 1] 

現在的第一個問題是如何保持在Java中此數據。

我試過了。

ArrayList value = new ArrayList(); 
value.add(new String("A")); 
value.add(new Integer(2)); 

當我嘗試寫這個數據使用

AerospikeClient client = client.put(new WritePolicy(), 
     new Key("namespace", "set", "test"), 
     new Bin("binName", value)); 

然後,如果我用AQL查詢,然後我看到

到塞| AC ED 00 05 73 72 00 13 6A 61 76 61 2E 75 74 69 6C 2E 41 72 72 61 79 4C 69 73 74 78 81 D2 1D 99 C7 61 9D 03 00 01 49 00 04 73 69 7A 65 78 70 00 00 00 02 77 04 00 00 00 02 73 72 00 11 6A 61 76 61 2E 6C 61 6E 67 2E 49 6E 74 65 67 65 72 12 E2 A0 A4 F7 81 87 |

一些十六進制數

但是當我嘗試將數據存儲到塞式使用

AerospikeClient client = client.put(new WritePolicy(), 
     new Key("namespace", "set", "test"), 
     new Bin("binName", Value.getAsList(value))); 

然後通過AQL的發射查詢給我

[ 「A」,1 ]

這是和看起來像預期的行爲,但是當我用塞式客戶端獲取的值,並檢查它們的類型

List<Object> ret = (List<Object>) client.get(new Policy(), key, "test").getValue("binName"); 

    if(ret.get(0) instanceof Long){ 
     System.out.println("Got instance of long"); 
    } 

然後我可以看到print語句雖然最初我發整型數據。

爲什麼會出現這種情況,任何人都可以告訴我任何替代的解決方案,以一個進來的數據保存到塞說的數據是

["A",1] 

PS:請支持你的答案與小代碼片段

發現this鏈路一些信息在GitHub

在參考有一些功能

對此我複製下面

/** 
* Write/Read ArrayList<Object> directly instead of relying on java serializer. 
*/ 
private void testListComplex(AerospikeClient client, Parameters params) throws Exception { 
    console.info("Read/Write ArrayList<Object>"); 
    Key key = new Key(params.namespace, params.set, "listkey2"); 
    client.delete(params.writePolicy, key); 

    byte[] blob = new byte[] {3, 52, 125};  
    ArrayList<Object> list = new ArrayList<Object>(); 
    list.add("string1"); 
    list.add(2); 
    list.add(blob); 

    Bin bin = new Bin(params.getBinName("listbin2"), list); 
    client.put(params.writePolicy, key, bin); 

    Record record = client.get(params.policy, key, bin.name); 
    List<?> receivedList = (List<?>) record.getValue(bin.name); 

    validateSize(3, receivedList.size()); 
    validate("string1", receivedList.get(0)); 
    // Server convert numbers to long, so must expect long. 
    validate(2L, receivedList.get(1)); 
    validate(blob, (byte[])receivedList.get(2)); 

    console.info("Read/Write ArrayList<Object> successful."); 
} 

/粘貼有一種意見,即服務器將數長

現在我有一個問題。那麼這是否意味着這種類型的Case整數不能被存儲?

回答

1

如果您檢查Aerospike datatypes,您會發現它們只支持64位整數,即Java中的long類型。

如果您不需要通過Lua UDF腳本訪問服務器上的這些數據,那麼您可以將其保存爲序列化的Blob數據。 java驅動程序已經支持原生序列化,這是你在第一次嘗試中所做的。 AQL只是向您顯示序列化的字節,但您可以在Java客戶端中讀取它。

或者您可以將它作爲json序列化字符串存儲,以便它與將來可能使用的其他語言驅動程序更加兼容。

+1

任何[不支持的類型](http://www.aerospike.com/docs/client/java/usage/data_type.html)(即應用程序端不直接映射到Aerospike服務器類型的類型)被序列化並在服務器上以as_bytes類型存儲。在這種情況下,它有一個[encoding](http://www.aerospike.com/docs/udf/api/bytes.html#encoding-type),表明它已被Java客戶端序列化(AS_BYTES_JAVA)。 –