📄 phpserializer.java
字号:
case __r:
return readRef(stream, ht, hv, rt);
case __a:
return readArray(stream, ht, hv, rt, charset);
case __O:
return readObject(stream, ht, hv, rt, charset);
case __C:
return readCustomObject(stream, ht, hv, charset);
case __R:
return readPointRef(stream, ht, hv, rt);
default:
return null;
}
}
private static String readNumber(ByteArrayInputStream stream) {
StringBuffer sb = new StringBuffer();
int i = stream.read();
while ((i != __Semicolon) && (i != __Colon)) {
sb.append((char) i);
i = stream.read();
}
return sb.toString();
}
private static Object readNull(ByteArrayInputStream stream) {
stream.skip(1);
return null;
}
private static Boolean readBoolean(ByteArrayInputStream stream) {
stream.skip(1);
Boolean b = new Boolean(stream.read() == __1);
stream.skip(1);
return b;
}
private static Number readInteger(ByteArrayInputStream stream) {
stream.skip(1);
String i = readNumber(stream);
try {
return new Byte(i);
} catch (Exception e1) {
try {
return new Short(i);
} catch (Exception e2) {
return new Integer(i);
}
}
}
private static Number readDouble(ByteArrayInputStream stream) {
stream.skip(1);
String d = readNumber(stream);
if (d.equals(__NAN)) {
return new Double(Double.NaN);
}
if (d.equals(__INF)) {
return new Double(Double.POSITIVE_INFINITY);
}
if (d.equals(__NINF)) {
return new Double(Double.NEGATIVE_INFINITY);
}
try {
return new Long(d);
} catch (Exception e1) {
try {
Float f = new Float(d);
if (f.isInfinite()) {
return new Double(d);
} else {
return f;
}
} catch (Exception e2) {
return new Float(0);
}
}
}
private static String readString(ByteArrayInputStream stream, String charset) {
stream.skip(1);
int len = Integer.parseInt(readNumber(stream));
stream.skip(1);
byte[] buf = new byte[len];
stream.read(buf, 0, len);
String s = getString(buf, charset);
stream.skip(2);
return s;
}
private static String readUnicodeString(ByteArrayInputStream stream) {
stream.skip(1);
int l = Integer.parseInt(readNumber(stream));
stream.skip(1);
StringBuffer sb = new StringBuffer(l);
int c;
for (int i = 0; i < l; i++) {
if ((c = stream.read()) == __Slash) {
char c1 = (char) stream.read();
char c2 = (char) stream.read();
char c3 = (char) stream.read();
char c4 = (char) stream.read();
sb.append(
(char) (Integer.parseInt(
new String(new char[] { c1, c2, c3, c4 }), 16)));
} else {
sb.append((char) c);
}
}
stream.skip(2);
return sb.toString();
}
private static UnSerializeResult readRef(ByteArrayInputStream stream, HashMap ht, int hv, HashMap rt) {
stream.skip(1);
Integer r = new Integer(readNumber(stream));
if (rt.containsKey(r)) {
rt.put(r, new Boolean(true));
}
Object obj = ht.get(r);
ht.put(new Integer(hv++), obj);
return new UnSerializeResult(obj, hv);
}
private static UnSerializeResult readPointRef(ByteArrayInputStream stream, HashMap ht, int hv, HashMap rt) {
stream.skip(1);
Integer r = new Integer(readNumber(stream));
if (rt.containsKey(r)) {
rt.put(r, new Boolean(true));
}
Object obj = ht.get(r);
return new UnSerializeResult(obj, hv);
}
private static UnSerializeResult readArray(ByteArrayInputStream stream, HashMap ht, int hv, HashMap rt, String charset) throws IllegalAccessException {
stream.skip(1);
int n = Integer.parseInt(readNumber(stream));
stream.skip(1);
HashMap h = new HashMap(n);
ArrayList al = new ArrayList(n);
Integer r = new Integer(hv);
rt.put(r, new Boolean(false));
int p = getPos(stream);
ht.put(new Integer(hv++), h);
for (int i = 0; i < n; i++) {
Object key;
switch (stream.read()) {
case __i:
key = cast(readInteger(stream), Integer.class);
break;
case __s:
key = readString(stream, charset);
break;
case __U:
key = readUnicodeString(stream);
break;
default:
return null;
}
UnSerializeResult result = unserialize(stream, ht, hv, rt, charset);
hv = result.hv;
if (al != null) {
if ((key instanceof Integer) && (((Integer) key).intValue() == i)) {
al.add(result.value);
} else {
al = null;
}
}
h.put(key, result.value);
}
if (al != null) {
ht.put(r, al);
if (((Boolean) (rt.get(r))).booleanValue()) {
hv = r.intValue() + 1;
setPos(stream, p);
for (int i = 0; i < n; i++) {
int key;
switch (stream.read()) {
case __i:
key = ((Integer) cast(readInteger(stream), Integer.class)).intValue();
break;
default:
return null;
}
UnSerializeResult result = unserialize(stream, ht, hv, rt,
charset);
hv = result.hv;
al.set(key, result.value);
}
}
}
rt.remove(r);
stream.skip(1);
return new UnSerializeResult(ht.get(r), hv);
}
private static UnSerializeResult readObject(ByteArrayInputStream stream, HashMap ht, int hv, HashMap rt, String charset) throws IllegalAccessException {
stream.skip(1);
int len = Integer.parseInt(readNumber(stream));
stream.skip(1);
byte[] buf = new byte[len];
stream.read(buf, 0, len);
String cn = getString(buf, charset);
stream.skip(2);
int n = Integer.parseInt(readNumber(stream));
stream.skip(1);
Class cls = getClass(cn);
Object o;
if (cls != null) {
if ((o = newInstance(cls)) == null) {
o = new HashMap(n);
}
} else {
o = new HashMap(n);
}
ht.put(new Integer(hv++), o);
for (int i = 0; i < n; i++) {
String key;
switch (stream.read()) {
case __s:
key = readString(stream, charset);
break;
case __U:
key = readUnicodeString(stream);
break;
default:
return null;
}
if (key.charAt(0) == (char) 0) {
key = key.substring(key.indexOf("\0", 1) + 1);
}
UnSerializeResult result = unserialize(stream, ht, hv, rt, charset);
hv = result.hv;
if (o instanceof HashMap) {
((HashMap) o).put(key, result.value);
} else {
Field f = getField(o, key);
f.setAccessible(true);
f.set(o, result.value);
}
}
stream.skip(1);
Method __wakeup = null;
try {
__wakeup = o.getClass().getMethod("__wakeup", new Class[0]);
__wakeup.invoke(o, new Object[0]);
} catch (Exception e) {}
return new UnSerializeResult(o, hv);
}
private static UnSerializeResult readCustomObject(ByteArrayInputStream stream, HashMap ht, int hv, String charset) {
stream.skip(1);
int len = Integer.parseInt(readNumber(stream));
stream.skip(1);
byte[] buf = new byte[len];
stream.read(buf, 0, len);
String cn = getString(buf, charset);
stream.skip(2);
int n = Integer.parseInt(readNumber(stream));
stream.skip(1);
Class cls = getClass(cn);
Object o;
if (cls != null) {
o = newInstance(cls);
} else {
o = null;
}
ht.put(new Integer(hv++), o);
if (o == null) {
stream.skip(n);
} else if (o instanceof org.phprpc.util.Serializable) {
byte[] b = new byte[n];
stream.read(b, 0, n);
((org.phprpc.util.Serializable) o).unserialize(b);
} else {
stream.skip(n);
}
stream.skip(1);
return new UnSerializeResult(o, hv);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -