理论指出,一组并发事务是可序列化的,当且仅当它们的并发执行等效于其中一个可能的串行执行。
现在下面的事务T1和T2的并发执行是可串行化的,因为等价于串行执行“T1然后T2”
T1: r1x w1y c1
T2: w2x c2
(i.e., T1 reads x, T2 writes x, T1 writes y, T2 commits, and finally, T1 commits)
Run Code Online (Sandbox Code Playgroud)
但是,在 PostgreSQL 10.4 中尝试时,如下所示:
T1: begin
T1: set transaction isolation level serializable;
T2: begin
T2: set transaction isolation level serializable;
T2: update variables set value = value + 1 where name = 'x'
T1: update variables set value = value + 1 where name = 'y'
T2: commit
T1: commit
Run Code Online (Sandbox Code Playgroud)
当此事务尝试提交时,数据库将中止 T1。为什么?
来自服务器代码的片段:
public void run() {
try {
// Create data input and output streams
ObjectInputStream inputFromClient = new ObjectInputStream(
socket.getInputStream());
ObjectOutputStream outputToClient = new ObjectOutputStream(
socket.getOutputStream());
while (true) {
cop = inputFromClient.readObject();
String[][] m1=new String[][] {{"1", "1","1"}};
Object xx=new getSerialModel(m1);
outputToClient.reset();
outputToClient.writeObject(xx);
outputToClient.flush();
}
}
Run Code Online (Sandbox Code Playgroud)
来自客户的片段:
//////////////
/// sockt jop
try {
// Create a socket to connect to the server
socket = new Socket("127.0.0."+Math.round(50+Math.random()*50), 8000);
// Create an output stream to send data to the server
toServer = new …Run Code Online (Sandbox Code Playgroud) 我需要为属性设置默认值,但我不能这样做:
private int prop = 1;
public Prop
{
get { return prop;} ...
}
Run Code Online (Sandbox Code Playgroud)
因为我需要序列化这个类,如果我这样做,我会松开默认值.
您是否知道在序列化之后和之前有效的任何解决方案,向属性添加属性?
我正在使用框架3.5的c#.
如果我有包含许多重复字符串的大对象图,那么在序列化它们之前对字符串进行实际的()是否有好处呢?这会减少传输的数据量吗?字符串会在接收端共享指针吗?
我的猜测是在发送之前将对字符串进行去除,从而减小数据的大小,并且它们将全部由接收端上的相同对象表示,但它们实际上不会在接收端被实现.(意味着每个序列化'事务'上会创建一个新的字符串实例)
问题说了一切.有没有特别的事件发生?我有一个需要实现Serializable接口的类.我正在使用Wicket开发一个应用程序.我已经实现了一个Factory类,它将提供一些链接(以删除一遍又一遍地写入的相同代码块的冗余):
public class NavigationLinkFactory implements Serializable {
private static final long serialVersionUID = 7836960726965363785L;
private NavigationLinkFactory() {
}
private static class SingletonHolder {
public static final NavigationLinkFactory instance = new NavigationLinkFactory();
}
public static NavigationLinkFactory getFactory() {
return SingletonHolder.instance;
}
private Object readResolve() throws ObjectStreamException {
return SingletonHolder.instance;
}
public Link<Serializable> getUserHomeLink() {
return new Link<Serializable>("home", new Model<Serializable>()) {
private static final long serialVersionUID = -8282608926361995521L;
@Override
public void onClick() {
EMSSession session = (EMSSession) getSession();
session.setActiveHorizonalMenu(1);
setResponsePage(HomePage.class);
}
}; …Run Code Online (Sandbox Code Playgroud) 这个问题不是关于如何使用 Serializable,我已经知道了.但是,我想知道如何实现Serializable提出以下警告:
The serializable class MyClass does not declare a static final serialVersionUID field of type long
假设我想编写一个接口Serializable,我将如何"警告"程序员实现我的接口来声明变量?我已经尝试查看源代码,Serializable.java但我找不到任何会导致此行为的内容.这甚至可能吗?
谢谢!
它让我从Serializable界面的启动中感到困惑,为什么我必须在我的所有课程中加入这个领域.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成它(也就是说,我确定,当被要求生成id时,eclipse会做什么).
所以我要问的是(这篇文章不仅仅是对标准库的咆哮)究竟是如何使用框架化序列化字段的?
我想知道的原因是因为我将尝试创建一个Aspect(使用AspectJ或其他语言),它将使用MD5哈希添加serialVersionUID字段,并且能够以API可接受的方式处理冲突.
如果我能让它发挥作用,我会发布结果.
这是我一直在尝试的代码
import java.util.Scanner;
import java.io.*;
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
protected ObjectOutputStream accData;
Scanner input = new Scanner(System.in);
}
class Savings extends Account implements Serializable {
Savings() throws IOException {
System.out.print("enter your name: ");
accountHolderName = input.nextLine();
System.out.print("\n");
System.out.print("enter your balance: ");
balance = input.nextLong();
accData = new ObjectOutputStream(new FileOutputStream(accountHolderName + ".bin"));
accData.writeObject(this);
accData.close();
}
}
class Banking implements Serializable {
public static void main(String args[]) throws IOException {
Scanner input = new …Run Code Online (Sandbox Code Playgroud) 我有一个system.document.table对象,我想将该对象标记为Serializable以便进行深度克隆。例外是程序集“ PresentationFramework,版本= 4.0.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35”中的类型“ System.Windows.Documents.Table”未标记为可序列化。
FlowTable original = new FlowTable();
original = objFlowTab.deepclone();
Run Code Online (Sandbox Code Playgroud)
其中objflowtab具有表对象
[Serializable]
public class FlowTable : Table
{ ....
....
public static class ExtensionMethods
{
// Deep clone
public static T DeepClone<T>(this T a)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream,a);
stream.Position = 0;
return (T)formatter.Deserialize(stream);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在formatter.Serialize(stream,a)中遇到错误;
如何制作private List <T> list;或可private Map<String, Value> unknownData; 序列化?这些是我的类中的变量,其父级是可序列化的,但是SonarQube抱怨瞬时或可序列化的更改
myClass.java
public class MyClass implements Serializable {
private static final long serialVersionUID = 0L;
protected List<T> list = new ArrayList<T>();
Run Code Online (Sandbox Code Playgroud)
serializable ×10
java ×7
c# ×2
.net ×1
aspects ×1
cloning ×1
concurrency ×1
default ×1
documents ×1
exception ×1
generics ×1
list ×1
object ×1
postgresql ×1
properties ×1
singleton ×1
sockets ×1
transactions ×1
transient ×1
wpf ×1