Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化RPC-GWT_Java_Php_Json_Gwt_Vb6 - Fatal编程技术网

Java 序列化RPC-GWT

Java 序列化RPC-GWT,java,php,json,gwt,vb6,Java,Php,Json,Gwt,Vb6,我想知道是否有一种方法可以从“字符串表”中获取序列化字符串 我需要的是在网页表单中发布一些数据。这是我手动操作时它发送的内容: 7 | 0 | 48 | contendor 1 | java.lang.Boolean/476441737 | gov.senasa.embalajemadera.shared.domain.Despachante/3149599025 | DESP | java.lang.Long/4227064769 | Treyes 8978-联邦首都|gonzalo@rsys

我想知道是否有一种方法可以从“字符串表”中获取序列化字符串

我需要的是在网页表单中发布一些数据。这是我手动操作时它发送的内容:

7 | 0 | 48 | contendor 1 | java.lang.Boolean/476441737 | gov.senasa.embalajemadera.shared.domain.Despachante/3149599025 | DESP | java.lang.Long/4227064769 | Treyes 8978-联邦首都|gonzalo@rsystem.com.ar|斯皮纳·冈萨洛| 45510141 |迪雷西翁·迪雷西翁|迪雷西翁exportador | java.util.Date/3385151746 | chasis/| gov.senasa.embalajemadera.shared.domain.ImportadorExportador/918958990|gonzalo@gmail.com|46326066 | gov.senasa.embalajemadera.shared.domain.datoduana/2671264783 | NRODESPACHO | IC01 | gov.senasa.embalajemadera.shared.domain.lugarderribo/3008903128 | NROMANIIMPO | gov.senasa.embalajemadera.shared.domain.PuntoIngreso/1183502123 | 717.3 | aduana origen | Terrestre camion | merca | gov.senasa.embalajemadera.shared.domain.Pais/3238585366 |澳大利亚|阿富汗| nombre“出口者”的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们的政府官员们们的官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方网站网站网站网站网站网站网站网站的官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方官方网站网站网站的官方官方官方官方官方官方网站的官方官方官方官方网站网站网站的官方官方网站的012400 012400 0 012400 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|0 | 0 | 0 | 0 | 0 | 28 |-11 | 29 | 0 | 0 | 19 |-13 | 21 | 30 | 0 | 0 | 23 | 31 | 0 | 0 | 0 | 0 | 0 1240 | 8 1240 1240 1240 1240 1240 1240 1240 | 18 1240 ||-2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01241717124周四周四0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 1812444 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 18 18 18 18\12444 4 4 3 3 3 3 3 3 3 3 3 3\\12444 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3\1717 17 17 17 17|0 | 42 | 0 | 43 | 10 | 10 | 42 | 0 | 44 | 10 | 0 |-22 |-5 | 45 | 0 | 0 |-18 | 8 | 1 | 46 1240 1240 1240 1240 1240 1240 1240 1240 1240 1240 1240 1240 1240 1240 1240|


我已经读过了,但正如您所看到的,这比文档中的示例要复杂一些。我不能制造有效载荷。我需要一个与VB6或PHP兼容的方法,或者只是一个很好的解释,这样我就可以制作自己的例程。谢谢

编辑:我回答了反序列化(如果要对服务器的结果进行处理,您可能仍然需要反序列化),但您要求进行序列化。第一部分仍然是请求的反序列化,但在中断部分下面,我将展示如何序列化请求,同样是使用我们在这个问题中所拥有的有限信息


请求反序列化 它可能比文档中的示例更大,但适用相同的规则。对于像这样的请求,我们将其分解如下,在
|
字符上拆分

七,

第7版

0

没有设置任何标志

四十八

接下来的48个标记是字符串表,用它们构建一个数组。这些字符串将表示正在传递的数据的类型,以及实际的Java字符串

所以我们将字符串读入一个字符串[48],然后所有剩余的数字要么是引用,要么是原语。像
ZRCrAA
VnTkM$A
这样的数据可能是base64编码的长数据。将其视为字符串列表,我们将在开始从数据请求对象时使用它

正如文件所说,我们现在从第二个列表中阅读参考文献(以
1 | 2 | 3 | 4 | 1 | 5 | 6 | 7 | 0 | 0 | 8…
开头)。当我们继续进行反序列化时,我们还需要四样东西:应用程序的url、策略的强名称、我们要调用的服务类以及该服务类中的方法名

因为这些都是字符串对象,所以我们将读取字符串。在
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader
中,实际的Java类将读取此内容,我们看到readString()如下所示:

@Override
public String readString() throws SerializationException {
  return getString(readInt());
}
ClientSerializationStreamWriter streamWriter = ...;//create with serializer
streamWriter.prepareToWrite();
streamWriter.writeString("com.acme.project.shared.MyService");//service interface
streamWriter.writeString("filterStrings");//method name
streamWriter.writeInt(2);//number of arguments to be found in the stream
streamWriter.writeObject(strings);
streamWriter.writeString(startsWith);
首先我们读取一个int,然后用它来查找字符串。下面是getString:

@Override
protected String getString(int index) {
  if (index == 0) {
    return null;
  }
  // index is 1-based
  assert (index > 0);
  assert (index <= stringTable.length);
  return stringTable[index - 1];
}
prepareToWrite()
方法以添加两个字符串开始流—模块基url和策略强名称,这两个字符串是您将从反序列化过程中识别的字符串。
toString()
方法显示了我们将写出的三个阶段:头、字符串表和“有效负载”,或对象引用和原语值

为什么跟踪的字符串与其他叶值不同?这样,我们将所有字符串放在一个地方,这样我们可以多次引用它们,并且每次只发送一次。这与XML或JSON形成对比,在XML或JSON中,每次需要使用值时,都必须再次写入该值,即使值完全相同

标头由版本(最新版本为7)和要设置的标志组成(在示例中,仅0即可)

在超类AbstractSerializationStreamWriter中,有四个字段:

private int objectCount;
private Map<Object, Integer> objectMap = new IdentityHashMap<Object, Integer>();
private Map<String, Integer> stringMap = new HashMap<String, Integer>();
private List<String> stringTable = new ArrayList<String>();
要准确地知道每个方法将编写什么,取决于知道Java中的方法签名是什么——只需编译GWT JS和一个有效负载示例,就有点难以进行反向工程。但让我们继续,看看接下来会发生什么

writeObject
的实现采用对象并首先记录其类型。如果对象为null,那么我们只需编写一个null字符串(也称为
0
)就可以了。否则,我们会检查之前是否已经写入了这个对象(因此写一个负数以查看负载中的去向),或者我们需要查看如何写入该对象的其余部分,并序列化每个字段

可以序列化的每个对象都必须有一个FieldSerializer,它描述了如何对该对象进行编码和解码。GWT中有许多CustomFieldSerializer,它们是用于特定目的的自定义实现,告诉RPC不要自动生成序列化程序。一个例子可能是ArrayList,如果我们在-
ArrayList\u CustomFieldSerializer
中传递了它,委托给
Collection\u CustomFieldSerializerBase
,它执行以下操作:

public static void serialize(SerializationStreamWriter streamWriter,
    Collection instance) throws SerializationException {
  int size = instance.size();
  streamWriter.writeInt(size);
  for (Object obj : instance) {
    streamWriter.writeObject(obj);
  }
}
首先我们写入列表的大小,以便反序列化器知道要读取多少元素,然后我们写入列表中的每个项。在我们的例子中,我们将把这些都写成字符串。然后,我们将再编写一个字符串,即方法的第二个参数

因此,我们在字符串表中有以下数据:

  • 基本URL
  • 策略字符串名称
  • “com.acme.project.shared.myservice
    public static void serialize(SerializationStreamWriter streamWriter,
        Collection instance) throws SerializationException {
      int size = instance.size();
      streamWriter.writeInt(size);
      for (Object obj : instance) {
        streamWriter.writeObject(obj);
      }
    }