我使用JavaScriptSerializerASP.net类来序列化我的对象并将其返回给客户端.如何使用JavaScript反序列化字符串?
问题:开发人员创建自己的序列化格式有多常见?具体来说,我使用java本质上将对象作为带有标记的巨型字符串发送以分隔变量.
我的逻辑:我选择了这个,因为它几乎消除了语言依赖性(忽略了java的修改过的UTF-8),你也没有对象版本问题,如果使用java的序列化,接收端必须具有完全相同的版本对象,因此在旧版本上运行的客户端将无法接收任何对象数据.代码不是太难看,而且看起来还不错,但我想我的问题是这个实例的最佳实践是什么?这是个人项目.
其他已知的选择:好的,我只是在处理序列化一个对象以通过网络发送它并且遇到了谷歌协议缓冲区.序列化对象的标准化程度如何?我基本上有三种方法可以做到这一点.(我将在这里讨论java,因为这就是我所做的)1)使用语言的(java)本机序列化类2)使用你自己的方式序列化对象可能使用字符串和标记3)使用Protocol Buffers或一些其他已知的格式(JSON,XML等)
根据我的收集,你在串行化时基本上有3个主要目标:1)速度/效率/大小2)语言独立3)版本接受(在旧版本的代码仍然可以接受新版本的部分和副本反之亦然)
大多数大型软件项目使用协议缓冲区吗?如果您的客户端是资源少得多的移动设备,它会改变吗?
在我的盒子上本地运行应用程序时,应用程序运行正常.部署到QA时,会收到以下错误.我在本地和QA运行Tomcat 5.5.23.该应用程序还使用Spring MVC.
ERROR 2011-03-01 16:41:42:异常加载会话来自持久存储java.io.WriteAbortedException:写入已中止; java.io.NotSerializableException:java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)中的java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)中的java.io.NotSerializableException:com.everbank.uft.entities.ldc.VoidReason,位于java的java.io.ObjectInputStream.readObject(ObjectInputStream.java:351). util.ArrayList.readObject(ArrayList.java:593)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl. java:25)at java.io.Object.Stotod.invoke(Method.java:597)at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849 )java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)at org.apache .catalina.session.StandardSession.readObject(StandardSession.java:1402)a org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:931)位于org.apache.catalina.session.StandardManager.load的org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:394) (StandardManager.java:321)位于org.apache的org.apache.catalina.session.StandardManager.start(StandardManager.java:637)org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:432). catalina.core.StandardContext.start(StandardContext.java:4160)org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java: 740)在org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)在org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:626)在org.apache.catalina.startup.HostConfig .deployDescriptors(HostConfig.java:553)org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)org.apache.catalina.startup.HostConfig.start(HostConf)ig.java:1138)在org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)在org.apache.catalina .core.ContainerBase.start(ContainerBase.java:1022)org.apache.catalina.core.StandardHost.start(StandardHost.java:736)org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014) )org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)位于org.apache.catalina.core.StandardServer的org.apache.catalina.core.StandardService.start(StandardService.java:448).启动(StandardServer.java:700)在org.apache.catalina.startup.Catalina.start(Catalina.java:552)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39)在org.apache.catalina.star上的java.lang.reflect.Method.invoke(Method.java:597)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)tup.Bootstrap.start(Bootstrap.java:295)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)引起:java.io.NotSerializableException:com.everbank.uft.entities.ldc. java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)中的java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)中的VoidReason,位于sun.reflect的java.util.ArrayList.writeObject(ArrayList.java:570) at.MativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method .java:597)java.io.Object.Start.Drite.StriteOdenialObject(ObjectOutputStream.java:1392)java.io.ObjectOreamputStream.writeSerialData(ObjectOutputStream.java:1461)的java.io.Object.StreamClass.invokeWriteObject(ObjectStreamClass.java:945)在java.io.ObjectOut上的java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)org.apache.catalina.session.StandardSession.writeObject(StandardSession.java:1478)中的putStream.writeObject(ObjectOutputStream.java:326)位于org.apache.catalina.session.StandardSession.writeObjectData(StandardSession.java:948)org .apache.catalina.session.StandardManager.doUnload(StandardManager.java:517)位于org.apache.catalina.session.StandardManager.stop(StandardManager.atload) .java:667)org.apache.catalina.core.StandardContext.stop(StandardContext.java:4363)位于org.apache.catalina的org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:893). startup.HostConfig.undeployApps(HostConfig.java:1180)在org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1151)在org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:313) org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java):1055)org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1067)org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:448)org.apache.catalina.core.标准服务.stop(StandardService.java:510)位于org.apache.catalina.core.StandardServer.stop(StandardServer.java:734)org.apache.catalina.startup.Catalina.stop(Catalina.java:602)org .apache.catalina.startup.Catalina.start(Catalina.java:577)... 6更多错误2011-03-01 16:42:49:UserTrackingFilter.doFilter()失败.消息:Servlet执行引发了异常javax.servlet.ServletException:Servlet执行在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain)引发异常.java:188)在org.apache.catalina的org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)的com.everbank.uft.filters.UserTrackingFilter.doFilter(UserTrackingFilter.java:65). core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)at com.everbank.uft.filters.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:36)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)at org .apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)org.apache.coyote.http11.Http11Processor.process(Http11Processor) .java:870)org.apache.coyote.http11.Http11BaseProtocol $ Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)at org. apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)在org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:685)在java.lang.Thread.run( Thread.java:619)
在编写一个简单的远程测试时,我遇到了一个涉及DBI(双括号初始化)的令人惊讶的情况,我一直无法完全理解,所以我会请求一些帮助.
请考虑以下代码:
public class RemotingTest {
@Autowired
private RemotingTestController remotingTestController;
//DBI
List<SomeBean> mockList = new ArrayList<SomeBean>(){{
add(MockFactoryBean.getMockBean());
}};
@Test
public void testRemoting() {
try {
// controller code is not relevant - it simply passes this list
// via Spring's HttpInvokerProxyFactoryBean to a session facade which then
// passes the list further down the SOA stack...
String result = remotingTestController.createBeanRemotely(mockList);
log.debug(result);
} catch (Exception e) {
fail();
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
}
此代码在运行时发生爆炸,出现以下错误,这对我没有意义:
java.io.NotSerializableException: org.stackoverflow.RemotingIntegrationTest at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) <<stacktrace snipped …
这是序列化矢量的后续操作
我正在尝试为我正在进行的游戏实现加载和保存.
我想保存一个Maze包含其他属性的ArrayList内容Entity.
实体是Dragon,Hero和Item的超级类.所有这三种类型都可以一次包含在载体中.
使用"自动"序列化机制(添加implements Serializable到Maze)保存所有属性,但是ArrayList.
为什么会这样?
为了完整起见,我的代码在下面.
package logic;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public final class LoadAndSave {
public static final transient boolean available = false;
public static final boolean serialize(Object obj) {
// Write to disk with FileOutputStream
FileOutputStream saveFile;
try {
saveFile = new FileOutputStream("game.sav");
} catch (FileNotFoundException e) {
return false;
}
// Write …Run Code Online (Sandbox Code Playgroud) 我想保存一个chessGameplay的状态.
private void saveToolStripMenuItem_Click(object sender, EventArgs e)// menu strip control
{
saveFileDialog1.InitialDirectory = @"c:\";
DialogResult result= saveFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
saveToFile(saveFileDialog1.FileName);
}
}
private void loadToolStripMenuItem_Click(object sender, EventArgs e)
{
openFileDialog1.InitialDirectory = @"c:\";
DialogResult result= openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
openFile(openFileDialog1.FileName);
}
}
GameSave game2 = new GameSave();
public void saveToFile(string s)
{
game2.setLoadedPieces(codeFile.PieceState());// will pass the current pieces state. that is an array of all the chess pieces objects..which determine where each piece is on the …Run Code Online (Sandbox Code Playgroud) 我正在阅读Thinking in Java 4th Edition.描述了transient字段序列化的奇怪解决方法:
import java.io.*;
public class SerializationTest implements Serializable {
private String firstData;
//transient field, shouldn't be serialized.
transient private String secondData;
public SerializationTest(String firstData, String test2) {
this.firstData = firstData;
this.secondData = test2;
}
/**
* Private method, same signature as in Serializable interface
*
* @param stream
* @throws IOException
*/
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.defaultWriteObject();
stream.writeObject(secondData);
}
/**
* Private method, same signature as in Serializable interface …Run Code Online (Sandbox Code Playgroud) 我遇到以下代码问题.序列化对象似乎有效,但是当我尝试反序列化它时,方法in.available()立即返回0(它不会进入while循环).由于(de)序列化逻辑是从这里复制的,我想它应该可行.
public class test {
public static enum Direction {NONE, UP, DOWN, LEFT, RIGHT}
/**
* @param args
*/
public static void main(String[] args) {
LinkedList<Node> list = new LinkedList<Node>();
list.add(new Node(1.0, 0));
list.add(new Node(2.0, 0));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out;
try {
out = new ObjectOutputStream(baos);
for(Node l:list)
out.writeObject(l);
baos.close();
out.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInput in;
in = new ObjectInputStream(bais);
while (in.available() > 0) {
Node l = (Node) …Run Code Online (Sandbox Code Playgroud) 我有一个已知良好的字典,并在运行时我需要建立一个新的字典和运行检查,看它是否具有相同的键值对作为已知的正确解释(按不同的顺序潜在的插入),并采取如果它有一条路径,如果没有则另一条路径.我不一定需要序列化整个已知良好的字典(我可以使用哈希,例如),但我需要的是具有对已知良好的字典足够的信息,一些磁盘上的数据,以便进行比较,如果不娱乐.最快的方法是什么?我可以使用SortedDictionary,但初始化和添加值所需的时间量计入此任务的速度.
具体例子:
考虑一个<String,List<String>>看起来像这样的字典(显然没有特定的顺序):
{ {"key1", {"value1", "value2"} }, {"key2", {"value3", "value4"} } }
Run Code Online (Sandbox Code Playgroud)
我创建了一次Dictionary并在磁盘上保存了一些关于它的信息(一个完整的序列化,一个哈希,等等).然后,在运行时,我执行以下操作:
Dictionary<String,List<String>> d1 = new Dictionary<String,List<String>> ();
Dictionary<String,List<String>> d2 = new Dictionary<String,List<String>> ();
Dictionary<String,List<String>> d3 = new Dictionary<String,List<String>> ();
String key11 = "key1";
String key12 = "key1";
String key13 = "key1";
String key21 = "key2";
String key22 = "key2";
String key23 = "key2";
List<String> value11 = new List<String> {"value1", "value2"};
List<String> value12 = new List<String> {"value1", "value2"};
List<String> value13 = new List<String> {"value1", "value2"};
List<String> …Run Code Online (Sandbox Code Playgroud) 如何将二进制文件反序列化为string?这是我到目前为止的示例代码:
public function serialize()
{
FileStream fs = new FileStream("test.txt", FileMode.Append);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, textBox1.Text);
fs.Flush();
fs.Close();
}
public function deserialize()
{
FileStream fs = File.Open(openFileDialog1.FileName, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
richTextBox1.Text = formatter.Deserialize(mystream) as string;
fs.Flush();
fs.Close();
}
Run Code Online (Sandbox Code Playgroud)
当我开始调试应用程序时,它只显示流的第一个字符串.流的其余部分没有显示出来.我该怎么解决这个问题?
serialization ×10
java ×6
c# ×3
arraylist ×1
asp.net ×1
class ×1
collections ×1
dictionary ×1
javascript ×1
json ×1
reflection ×1
servlets ×1
spring ×1
tomcat ×1
winforms ×1