📄 phpserializer.java
字号:
int mod = f[i].getModifiers();
if (Modifier.isPublic(mod)) {
writeString(stream, getBytes(f[i].getName(), charset));
} else if (Modifier.isProtected(mod)) {
writeString(stream,
getBytes("\0*\0" + f[i].getName(), charset));
} else {
writeString(stream,
getBytes(
"\0" + getClassName(f[i].getDeclaringClass())
+ "\0" + f[i].getName(),
charset));
}
Object o;
try {
o = f[i].get(obj);
} catch (Exception e) {
o = null;
}
hv = serialize(stream, o, ht, hv, charset);
}
stream.write(__RightB);
}
} else {
writeNull(stream);
}
return hv;
}
private static byte[] getBytes(Object obj) {
try {
return obj.toString().getBytes("US-ASCII");
} catch (Exception e) {
return obj.toString().getBytes();
}
}
private static byte[] getBytes(Object obj, String charset) {
try {
return obj.toString().getBytes(charset);
} catch (Exception e) {
return obj.toString().getBytes();
}
}
private static String getString(byte[] data, String charset) {
try {
return new String(data, charset);
} catch (Exception e) {
return new String(data);
}
}
private static Class getClass(String className) {
try {
Class cls = Class.forName(className);
return cls;
} catch (Exception e) {}
for (int i = 0; i < __packages.length; i++) {
try {
Class cls = Class.forName(
__packages[i].getName() + "." + className);
return cls;
} catch (Exception e) {}
}
return null;
}
private static String getClassName(Class cls) {
return cls.getName().substring(cls.getPackage().getName().length() + 1);
}
private static Field getField(Object obj, String fieldName) {
Class cls = obj.getClass();
while (cls != null) {
try {
Field result = cls.getDeclaredField(fieldName);
int mod = result.getModifiers();
if (Modifier.isFinal(mod) || Modifier.isStatic(mod)) {
return null;
}
return result;
} catch (Exception e) {}
cls = cls.getSuperclass();
}
return null;
}
private static Field[] getFields(Object obj, String[] fieldNames) {
if (fieldNames == null) {
return getFields(obj);
}
int n = fieldNames.length;
ArrayList fields = new ArrayList(n);
for (int i = 0; i < n; i++) {
Field f = getField(obj, fieldNames[i]);
if (f != null) {
fields.add(f);
}
}
return (Field[]) fields.toArray(new Field[0]);
}
private static Field[] getFields(Object obj) {
ArrayList fields = new ArrayList();
Class cls = obj.getClass();
while (cls != null) {
Field[] fs = cls.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
int mod = fs[i].getModifiers();
if (!Modifier.isFinal(mod) && !Modifier.isStatic(mod)) {
fields.add(fs[i]);
}
}
cls = cls.getSuperclass();
}
return (Field[]) fields.toArray(new Field[0]);
}
public static Object newInstance(Class cls) {
try {
Constructor ctor = cls.getConstructor(new Class[0]);
int mod = ctor.getModifiers();
if (Modifier.isPublic(mod)) {
return ctor.newInstance(new Object[0]);
}
} catch (Exception e) {}
try {
Constructor ctor = cls.getConstructor(new Class[] { Integer.TYPE });
int mod = ctor.getModifiers();
if (Modifier.isPublic(mod)) {
return ctor.newInstance(new Object[] { new Integer(0) });
}
} catch (Exception e) {}
try {
Constructor ctor = cls.getConstructor(new Class[] { Boolean.TYPE });
int mod = ctor.getModifiers();
if (Modifier.isPublic(mod)) {
return ctor.newInstance(new Object[] { new Boolean(false) });
}
} catch (Exception e) {}
try {
Constructor ctor = cls.getConstructor(new Class[] { String.class });
int mod = ctor.getModifiers();
if (Modifier.isPublic(mod)) {
return ctor.newInstance(new Object[] { "" });
}
} catch (Exception e) {}
Field[] f = cls.getFields();
for (int i = 0; i < f.length; i++) {
if (f[i].getType() == cls && Modifier.isStatic(f[i].getModifiers())) {
try {
return f[i].get(null);
} catch (Exception e) {}
}
}
Method[] m = cls.getMethods();
for (int i = 0; i < m.length; i++) {
if (m[i].getReturnType() == cls
&& Modifier.isStatic(m[i].getModifiers())) {
try {
return m[i].invoke(null, new Object[0]);
} catch (Exception e) {}
try {
return m[i].invoke(null, new Object[] { new Integer(0) });
} catch (Exception e) {}
try {
return m[i].invoke(null, new Object[] { new Boolean(false) });
} catch (Exception e) {}
try {
return m[i].invoke(null, new Object[] { "" });
} catch (Exception e) {}
}
}
return null;
}
public static Number cast(Number n, Class destClass) {
if (destClass == Byte.class) {
return new Byte(n.byteValue());
}
if (destClass == Short.class) {
return new Short(n.shortValue());
}
if (destClass == Integer.class) {
return new Integer(n.intValue());
}
if (destClass == Long.class) {
return new Long(n.longValue());
}
if (destClass == Float.class) {
return new Float(n.floatValue());
}
if (destClass == Double.class) {
return new Double(n.doubleValue());
}
return n;
}
public static Object cast(Object obj, Class destClass) {
if (obj == null || destClass == null) {
return obj;
} else if (obj.getClass() == destClass) {
return obj;
} else if (obj instanceof Number) {
return cast((Number) obj, destClass);
} else if ((obj instanceof String) && destClass == Character.class) {
return new Character(((String)obj).charAt(0));
} else if ((obj instanceof ArrayList) && destClass.isArray()) {
return toArray((ArrayList) obj, destClass.getComponentType());
} else if ((obj instanceof ArrayList) && destClass == HashMap.class) {
return toHashMap((ArrayList) obj);
} else {
return obj;
}
}
private static HashMap toHashMap(ArrayList a) {
int n = a.size();
HashMap h = new HashMap(n);
for (int i = 0; i < n; i++) {
h.put(new Integer(i), a.get(i));
}
return h;
}
private static Object toArray(ArrayList obj, Class componentType) {
int n = obj.size();
Object a = Array.newInstance(componentType, n);
for (int i = 0; i < n; i++) {
Array.set(a, i, cast(obj.get(i), componentType));
}
return a;
}
private static int getPos(ByteArrayInputStream stream) {
try {
Field pos = stream.getClass().getDeclaredField("pos");
pos.setAccessible(true);
return pos.getInt(stream);
} catch (Exception e) {
return 0;
}
}
private static void setPos(ByteArrayInputStream stream, int p) {
try {
Field pos = stream.getClass().getDeclaredField("pos");
pos.setAccessible(true);
pos.setInt(stream, p);
} catch (Exception e) {}
}
public static Object unserialize(byte[] ss) throws IllegalAccessException {
return unserialize(ss, null, "UTF-8");
}
public static Object unserialize(byte[] ss, String charset) throws IllegalAccessException {
return unserialize(ss, null, charset);
}
public static Object unserialize(byte[] ss, Class cls) throws IllegalAccessException {
return unserialize(ss, cls, "UTF-8");
}
public static Object unserialize(byte[] ss, Class cls, String charset) throws IllegalAccessException {
int hv = 1;
ByteArrayInputStream stream = new ByteArrayInputStream(ss);
Object result = unserialize(stream, new HashMap(), hv, new HashMap(), charset).value;
try {
stream.close();
} catch (Exception e) {}
return cast(result, cls);
}
private static UnSerializeResult unserialize(ByteArrayInputStream stream, HashMap ht, int hv, HashMap rt, String charset) throws IllegalAccessException {
Object obj;
switch (stream.read()) {
case __N:
obj = readNull(stream);
ht.put(new Integer(hv++), obj);
return new UnSerializeResult(obj, hv);
case __b:
obj = readBoolean(stream);
ht.put(new Integer(hv++), obj);
return new UnSerializeResult(obj, hv);
case __i:
obj = readInteger(stream);
ht.put(new Integer(hv++), obj);
return new UnSerializeResult(obj, hv);
case __d:
obj = readDouble(stream);
ht.put(new Integer(hv++), obj);
return new UnSerializeResult(obj, hv);
case __s:
obj = readString(stream, charset);
ht.put(new Integer(hv++), obj);
return new UnSerializeResult(obj, hv);
case __U:
obj = readUnicodeString(stream);
ht.put(new Integer(hv++), obj);
return new UnSerializeResult(obj, hv);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -