【问题标题】:How to store a SoapObject or Envelope in a File如何将 SoapObject 或信封存储在文件中
【发布时间】:2014-04-17 07:32:19
【问题描述】:

我试图将SoapObjectEnvelope 存储在一个文件中,但认为它不可序列化,它没有存储在文件中。

我的目标是将SoapObjectEnvelope 一次存储在文件中,而不是构建一个新的SoapObjectEnvelope,而是从存储的文件中获取该对象。

我已经使用easywsdl.com 站点创建了所有方法。它有其自定义的ExtendedSoapSerializationEnvelope,具有以下定义。

public class ExtendedSoapSerializationEnvelope extends
    SoapSerializationEnvelope
{
    //Envelop code
}

我使用以下模式使信封可序列化。

public class ExtendedSoapSerializationEnvelope extends
    SoapSerializationEnvelope implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;
}

并在文件中使用以下代码编写。

public static void writeEnvelope(Object object) throws IOException {
    File file = new File(Environment.getExternalStorageDirectory()
            .getAbsoluteFile() + File.separator + "envelope.txt");
    FileOutputStream fos = new FileOutputStream(file);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(object);
    oos.close();
    fos.close();
}

它成功写入Envelope,但是当我尝试使用以下代码从文件中读取该对象时,

public static Object readEnvelope() throws IOException,
        ClassNotFoundException {
    File file = new File(Environment.getExternalStorageDirectory()
            .getAbsoluteFile() + File.separator + "envelope.txt");
    FileInputStream fis = new FileInputStream(file);
    ObjectInputStream ois = new ObjectInputStream(fis);
    Object object = ois.readObject();
    return object;
}

它触发以下异常,

java.io.InvalidClassException: org.ksoap2.serialization.SoapSerializationEnvelope; IllegalAccessException

有没有人有想法来实现这一目标?还有其他方法吗?

【问题讨论】:

  • 你能从这个问题中得到解决方案吗?

标签: java android serialization ksoap2


【解决方案1】:

嘿这里是保存 SoapObject 到文件并从文件中获取它的方法。

public boolean saveToFile(SoapObject temp) {
    Log.d("DEBUG", "saveFile");

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(temp);
    XmlSerializer aSerializer = Xml.newSerializer();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    try {
        aSerializer.setOutput(os, "UTF-8");
        envelope.write(aSerializer);
        aSerializer.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
    byte[] bytes = os.toByteArray();
    try {
        FileOutputStream fos = _context.openFileOutput("response" + ".xml", Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(bytes);
        oos.close();
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        Log.d("DEBUG", "IOException " + e.getMessage());
        return false;
    }
}


public SoapObject getFromFile() {
    Log.d("DEBUG", "getFile");
    ObjectInputStream input;
    String filename = "response.xml";
    try {
        FileInputStream fis = _context.openFileInput(filename);
        input = new ObjectInputStream(fis);
        byte[] bytes = (byte[]) input.readObject();
        input.close();
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        SoapObject soap = null;
        try {
            ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
            XmlPullParser p = Xml.newPullParser();
            p.setInput(inputStream, "UTF-8");
            envelope.parse(p);
            soap = (SoapObject) envelope.bodyIn;
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("DEBUG", "Exception " + e.getLocalizedMessage());
        }
        return soap;
    } catch (StreamCorruptedException e) {
        e.printStackTrace();
        Log.d("DEBUG", "StreamCorruptedException " + e.getLocalizedMessage());
        return null;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Log.d("DEBUG", "FileNotFoundException " + e.getLocalizedMessage());
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        Log.d("DEBUG", "IOException " + e.getLocalizedMessage());
        return null;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        Log.d("DEBUG", "ClassNotFoundException " + e.getLocalizedMessage());
        return null;
    }
}

它存储在 android app 文件夹中,而不是存储在 sdcard 或手机存储中

【讨论】:

    【解决方案2】:

    将 SoapObject 保存为 XMl,有时直接解析可能会导致内存不足。

    public boolean saveToXML(SoapObject temp) {
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(temp);
    XmlSerializer aSerializer = Xml.newSerializer();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    try {
        aSerializer.setOutput(os, "UTF-8");
        envelope.write(aSerializer);
        aSerializer.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
    byte[] bytes = os.toByteArray();
    try {
        FileOutputStream fos = _context.openFileOutput("response" + ".xml", Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(bytes);
        oos.close();
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 2015-09-30
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多