Thanks to @sorifiend I was able to store Mat via tinyDB.
how-to-serialize-deserialize-opencv-mat-in-java :- It works for only for Mat
I did more googling and found a solution on stack overflow for MatOfKeyPoint too but can not find link to it.
So below is the class I made after combining both the solutions :
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.opencv.core.KeyPoint;
import org.opencv.core.Mat;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.core.Point;
class SerializeTheMat
{
    public static String keypointsToJson(MatOfKeyPoint mat){
        if(mat!=null && !mat.empty()){
            Gson gson = new Gson();
            JsonArray jsonArr = new JsonArray();
            KeyPoint[] array = mat.toArray();
            for(int i=0; i<array.length; i++){
                KeyPoint kp = array[i];
                JsonObject obj = new JsonObject();
                obj.addProperty("class_id", kp.class_id);
                obj.addProperty("x",        kp.pt.x);
                obj.addProperty("y",        kp.pt.y);
                obj.addProperty("size",     kp.size);
                obj.addProperty("angle",    kp.angle);
                obj.addProperty("octave",   kp.octave);
                obj.addProperty("response", kp.response);
                jsonArr.add(obj);
            }
            String json = gson.toJson(jsonArr);
            return json;
        }
        return "{}";
    }
    public static MatOfKeyPoint keypointsFromJson(String json){
        MatOfKeyPoint result = new MatOfKeyPoint();
        JsonParser parser = new JsonParser();
        JsonArray jsonArr = parser.parse(json).getAsJsonArray();
        int size = jsonArr.size();
        KeyPoint[] kpArray = new KeyPoint[size];
        for(int i=0; i<size; i++){
            KeyPoint kp = new KeyPoint();
            JsonObject obj = (JsonObject) jsonArr.get(i);
            Point point = new Point(
                    obj.get("x").getAsDouble(),
                    obj.get("y").getAsDouble()
            );
            kp.pt       = point;
            kp.class_id = obj.get("class_id").getAsInt();
            kp.size     =     obj.get("size").getAsFloat();
            kp.angle    =    obj.get("angle").getAsFloat();
            kp.octave   =   obj.get("octave").getAsInt();
            kp.response = obj.get("response").getAsFloat();
            kpArray[i] = kp;
        }
        result.fromArray(kpArray);
        return result;
    }
    //  Serialization/deserialization utility
    public static String SerializeFromMat(Mat mat)
    {
        SerializedMat serializedMat = new SerializedMat();
        serializedMat.setType(mat.type());
        serializedMat.setRows(mat.rows());
        serializedMat.setCols(mat.cols());
        if (serializedMat.getType()==0||
                serializedMat.getType()==8||
                serializedMat.getType()==16||
                serializedMat.getType()==24)
        {
            serializedMat.setBytes(new byte[(int)(mat.total()*mat.elemSize())]);
            mat.get(0,0,serializedMat.bytes);
        }
        else if (serializedMat.getType()==1||
                serializedMat.getType()==9||
                serializedMat.getType()==17||
                serializedMat.getType()==25)
        {
            serializedMat.setBytes(new byte[(int)(mat.total()*mat.elemSize())]);
            mat.get(0,0,serializedMat.bytes);
        }
        else if (serializedMat.getType()==2||
                serializedMat.getType()==10||
                serializedMat.getType()==18||
                serializedMat.getType()==26)
        {
            serializedMat.setShorts(new short[(int)(mat.total()*mat.elemSize())]);
            mat.get(0,0,serializedMat.shorts);
        }
        else if (serializedMat.getType()==3||
                serializedMat.getType()==11||
                serializedMat.getType()==19||
                serializedMat.getType()==27)
        {
            serializedMat.setShorts(new short[(int)(mat.total()*mat.elemSize())]);
            mat.get(0,0,serializedMat.shorts);
        }
        else if (serializedMat.getType()==4||
                serializedMat.getType()==12||
                serializedMat.getType()==20||
                serializedMat.getType()==28)
        {
            serializedMat.setInts(new int[(int)(mat.total()*mat.elemSize())]);
            mat.get(0,0,serializedMat.ints);
        }
        else if (serializedMat.getType()==5||
                serializedMat.getType()==13||
                serializedMat.getType()==21||
                serializedMat.getType()==29)
        {
            serializedMat.setFloats(new float[(int)(mat.total()*mat.elemSize())]);
            mat.get(0,0,serializedMat.floats);
        }
        else if (serializedMat.getType()==6||
                serializedMat.getType()==14||
                serializedMat.getType()==22||
                serializedMat.getType()==30)
        {
            serializedMat.setDoubles(new double[(int)(mat.total()*mat.elemSize())]);
            mat.get(0,0,serializedMat.doubles);
        }
//        return "";
        Gson gson = new Gson();
        return gson.toJson(serializedMat);
    }
    public static Mat DeserializeToMat(String json)
    {
        Gson gson = new Gson();
        SerializedMat serializedMat = gson.fromJson(json, SerializedMat.class);
        Mat mat = new Mat(serializedMat.getRows(),serializedMat.getCols(),serializedMat.getType());
        if (serializedMat.getType()==0||
                serializedMat.getType()==8||
                serializedMat.getType()==16||
                serializedMat.getType()==24)
        {
            mat.put(0,0,serializedMat.getBytes());
        }
        else if (serializedMat.getType()==1||
                serializedMat.getType()==9||
                serializedMat.getType()==17||
                serializedMat.getType()==25)
        {
            mat.put(0,0,serializedMat.getBytes());
        }
        else if (serializedMat.getType()==2||
                serializedMat.getType()==10||
                serializedMat.getType()==18||
                serializedMat.getType()==26)
        {
            mat.put(0,0,serializedMat.getShorts());
        }
        else if (serializedMat.getType()==3||
                serializedMat.getType()==11||
                serializedMat.getType()==19||
                serializedMat.getType()==27)
        {
            mat.put(0,0,serializedMat.getShorts());
        }
        else if (serializedMat.getType()==4||
                serializedMat.getType()==12||
                serializedMat.getType()==20||
                serializedMat.getType()==28)
        {
            mat.put(0,0,serializedMat.getInts());
        }
        else if (serializedMat.getType()==5||
                serializedMat.getType()==13||
                serializedMat.getType()==21||
                serializedMat.getType()==29)
        {
            mat.put(0,0,serializedMat.getFloats());
        }
        else if (serializedMat.getType()==6||
                serializedMat.getType()==14||
                serializedMat.getType()==22||
                serializedMat.getType()==30)
        {
            mat.put(0,0,serializedMat.getDoubles());
        }
        return mat;
    }
    private static class SerializedMat
    {
        byte[] bytes;
        short[] shorts;
        int[] ints;
        float[] floats;
        double[] doubles;
        int type;
        int rows;
        int cols;
        byte[] getBytes()
        {
            return bytes;
        }
        void setBytes(byte[] bytes)
        {
            this.bytes = bytes;
        }
        short[] getShorts()
        {
            return shorts;
        }
        void setShorts(short[] shorts)
        {
            this.shorts = shorts;
        }
        int[] getInts()
        {
            return ints;
        }
        void setInts(int[] ints)
        {
            this.ints = ints;
        }
        float[] getFloats()
        {
            return floats;
        }
        void setFloats(float[] floats)
        {
            this.floats = floats;
        }
        double[] getDoubles()
        {
            return doubles;
        }
        void setDoubles(double[] doubles)
        {
            this.doubles = doubles;
        }
        int getType()
        {
            return type;
        }
        void setType(int type)
        {
            this.type = type;
        }
        int getRows()
        {
            return rows;
        }
        void setRows(int rows)
        {
            this.rows = rows;
        }
        int getCols()
        {
            return cols;
        }
        void setCols(int cols)
        {
            this.cols = cols;
        }
        SerializedMat()
        {
        }
    }
}
And you can store using tinyDB like below
String kp_to_json=SerializeTheMat.keypointsToJson(kp_ref);
String descriptors =  SerializeTheMat.SerializeFromMat(data);
tinyDB.putString("DESC", descriptors);
tinyDB.putString("KP", kp_to_json);
And get it back like follows:
data = SerializeTheMat.DeserializeToMat(tinyDB.getString("DESC"));
kp_ref = SerializeTheMat.keypointsFromJson(tinyDB.getString("KP"));
For storing them locally you can write JSON file from those string and read those JSON files whenever needed.
THANKS