我有两个列表(list1和list2)包含对某些对象的引用,其中一些列表条目可能指向同一个对象.然后,由于各种原因,我将这些列表序列化为两个单独的文件.最后,当我反序列化列表时,我想确保我不会重新创建超出需要的对象.换句话说,List1的某些条目仍然可以指向与List2中的某个条目相同的对象.
MyObject obj = new MyObject();
List<MyObject> list1 = new ArrayList<MyObject>();
List<MyObject> list2 = new ArrayList<MyObject>();
list1.add(obj);
list2.add(obj);
// serialize to file1.ser
ObjectOutputStream oos = new ObjectOutputStream(...);
oos.writeObject(list1);
oos.close();
// serialize to file2.ser
oos = new ObjectOutputStream(...);
oos.writeObject(list2);
oos.close();
Run Code Online (Sandbox Code Playgroud)
我认为规范的 3.4和A.2节说反序列化严格地导致了新对象的创建,但我不确定.如果是这样,一些可能的解决方案可能涉
是否有一种简单的方法可以确保在反序列化时不会复制对象?
谢谢.
是否可以编写单个模板化函数来递增不同结构的(数字)字段?例如:
struct Color
{
ubyte a,r,g,b;
}
struct Point
{
double x, y;
}
Run Code Online (Sandbox Code Playgroud)
我试过这样的事情:
T update(T, A)(T t, A a)
if (is(T == struct))
{
auto vals = t.tupleof;
foreach (i; 0 .. vals.length) {
vals[i] += a; // error: i cannot be read at compile time
}
return T(vals); // convert back to struct
}
Run Code Online (Sandbox Code Playgroud)
我也尝试编写接受元组的函数模板,但是元组总是被扩展,这会阻止编译器匹配正确的模板.谢谢.
我在使用字符实例化RedBlackTree容器时遇到问题,但它可以使用ints:
import std.stdio;
import std.container;
void main()
{
auto r1 = redBlackTree!(int)(); // works
auto r2 = redBlackTree!(char)(); // error instantiating
}
Run Code Online (Sandbox Code Playgroud)
我正在使用DMD32 D Compiler v2.060.
有什么想法吗?谢谢.