- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个接口(interface)和类(您可以查看 here 以查看所有相关代码都是可编译的)。我将只提供最少的代码来描述问题(不可编译的代码):
interface IViz<T> : ISerializable {
IEnumerable<SelectedValue> SelectedValues { get; }
};
[Serializable]
abstract class GroupViz<T, TIn, TOut> : IViz<T> {
public IEnumerable<SelectedValue> SelectedValues
{
get { return selectedValues.Cast<SelectedValue>(); }
}
}
[Serializable]
public class EntityValueGroupViz<TEntity, TKey> : ValueGroupViz<TEntity, TKey>
在第一个界面(IViz
)我声明了一个属性IEnumerable<SelectedValue> SelectedValues
每个 SelectedValue
存储在哪里对象。
SelectedValue
有两个实现(通用的和非通用的):
[Serializable]
public abstract class SelectedValue : ISerializable
{
public SelectedValue(SerializationInfo info, StreamingContext context)
{
Configuration.SerializationTemplatesEnum serializationTemplateEnum = (Configuration.SerializationTemplatesEnum)context.Context;
foreach (SerializationEntry entry in info)
{
switch (serializationTemplateEnum)
{
case Configuration.SerializationTemplatesEnum.QUERY:
switch (entry.Name)
{
case "Value":
Value = entry.Value;
break;
case "Operator":
Operator = (VizOperatorEnum)entry.Value;
break;
}
break;
case Configuration.SerializationTemplatesEnum.TEMPLATE:
break;
}
}
}
}
[Serializable]
public class SelectedValue<T> : SelectedValue, ISerializable
{
public SelectedValue(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
我正在使用 BinaryFormatter
为了序列化它们,它们(SelectedValue
属性上的 IViz.SelectValues
对象)在文件中被序列化。
但是,当我尝试反序列化它们时,它们没有被加载。我在 SelectedValue(SerializationInfo info, StreamingContext context)
上添加了一个断点构造函数,但未达到。
我还尝试添加一个 set;
在 IViz.SelectedValues
上实现属性,我还尝试将属性设置为 IList
而不是 IEnumerable
.但是结果是一样的:我的 SelectedValue
对象未反序列化。
有什么想法吗?
最佳答案
我能够通过构建 EntityValueGroupViz<BOEntity, BOEntity>
的实例重现您的问题, 添加 SelectedValue<BOEntity>(new BOEntity(), "hello")
到它,并序列化。参见 this fiddle对于 mcve .
但是,为了重现问题,我必须:
标记 BOEntity
作为[Serializable]
.
将默认和流式构造函数添加到 GroupViz<T, TIn, TOut>
和 ValueGroupViz<T, TIn>
.
分配 selectedValues
列表里面GroupViz<T, TIn, TOut>
在构造函数中。
将默认构造函数添加到 EntityValueGroupViz<TEntity, TKey>
.
一旦完成这些初步修复,问题就会在 EntityValueGroupViz<TEntity, TKey>
的流式构造函数中变得明显。 :
protected EntityValueGroupViz(SerializationInfo info, StreamingContext context)
{
foreach (SerializationEntry entry in info)
{
switch (entry.Name)
{
case "SelectedValues":
foreach (SelectedValue sv in (IEnumerable<SelectedValue>)entry.Value)
this.Value(sv);
break;
}
}
}
调用时,(IEnumerable<SelectedValue>)entry.Value
有空条目。但是,这是为什么呢? BinaryFormatter
是一个图形序列化器。对象不是存储在纯树中,而是分配临时对象 ID 并在遇到时存储。当一个对象被反序列化时,不能保证所有引用的对象之前都被反序列化过。因此,您的 entry.Value
中的条目可能在调用流式构造函数时尚未填写。作为确认,Microsoft writes
Objects are reconstructed from the inside out, and calling methods during deserialization can have undesirable side effects, since the methods called might refer to object references that have not been deserialized by the time the call is made.
遍历 List<T>
实际上确实涉及调用它的方法。
那么,如何处理呢?有几个可能的解决方法:
实现 IDeserializationCallback
在 EntityValueGroupViz<TEntity, TKey>
, 暂时缓存 entry.Value
在流式构造函数中,稍后将其添加到 IDeserializationCallback.OnDeserialization()
中的基类中:
[Serializable]
public class EntityValueGroupViz<TEntity, TKey> : ValueGroupViz<TEntity, TKey>, IDeserializationCallback
{
IEnumerable<SelectedValue> cachedEntry;
// Added necessary default constructor.
public EntityValueGroupViz() : base() { }
protected EntityValueGroupViz(SerializationInfo info, StreamingContext context) : base(info, context)
{
foreach (SerializationEntry entry in info)
{
switch (entry.Name)
{
case "SelectedValues":
cachedEntry = (IEnumerable<SelectedValue>)entry.Value;
break;
}
}
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("SelectedValues", SelectedValues);
}
#region IDeserializationCallback Members
public void OnDeserialization(object sender)
{
if (cachedEntry != null)
{
foreach (SelectedValue sv in cachedEntry)
this.Value(sv);
cachedEntry = null;
}
}
#endregion
}
样本 fiddle .
简单地在字段存在的基类中序列化选定值的列表。 BinaryFormatter
序列化流是完全类型化的,所以 selectedValues
即使基类不知道集合中的子类型,字段也可以存储在那里:
[Serializable]
public abstract class GroupViz<T, TIn, TOut> : IViz<T>
{
// Added necessary default and streaming constructors
public GroupViz()
{
selectedValues = new List<SelectedValue>();
}
protected GroupViz(SerializationInfo info, StreamingContext context)
{
selectedValues = (IList<SelectedValue>)info.GetValue("SelectedValues", typeof(IList<SelectedValue>));
}
// Allocated the list
private IList<SelectedValue> selectedValues;
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("SelectedValues", selectedValues);
}
public IEnumerable<SelectedValue> SelectedValues
{
get { return selectedValues.Cast<SelectedValue>(); }
}
public void Value(SelectedValue @value)
{
this.AddValue(@value.Value, @value.Operator);
}
private void AddValue(object @value, object vizOperator)
{
SelectedValue<TOut> selectedValue = new SelectedValue<TOut>((TOut)value, vizOperator);
if (!this.selectedValues.Any(sv => sv.Equals(selectedValue)))
this.selectedValues.Add(selectedValue);
}
}
public abstract class ValueGroupViz<T, TIn> : GroupViz<T, TIn, TIn>
{
// Added necessary default and streaming constructors
public ValueGroupViz() : base() { }
protected ValueGroupViz(SerializationInfo info, StreamingContext context) : base(info, context) { }
}
[Serializable]
public class EntityValueGroupViz<TEntity, TKey> : ValueGroupViz<TEntity, TKey>
{
// Added necessary default constructor.
public EntityValueGroupViz() : base() { }
protected EntityValueGroupViz(SerializationInfo info, StreamingContext context) : base(info, context) { }
}
如您所见,此解决方案更简单,因此值得推荐。
样本 fiddle #2 .
关于c# - BinaryFormatter 不会反序列化 IEnumerable 上的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549392/
我有几个系统使用 docker-compose 并且没有问题。 但是,我在这里有一个“向下”根本不做任何事情的地方。 'up'虽然完美。这是在 MacOS 上。 该项目的昵称是“ Storm ”,脚本
解释起来确实很奇怪,所以就这样...... 我正在从 phpmyadmin 获取包含未转义单引号的数据。我正在尝试转换'至'通过使用Content-Type: text/html;在 php
伙计们?在这里需要一些帮助。我使用委托(delegate)协议(protocol)将一些字符串从“第二个 View Controller ”传回给它的前一个。 我的数组附加了我在委托(delegate
我有以下 eval() 东西: c = Customer() eval("c.name = row.value('customer', '{c}')".format(c=column_name), {
我写了这个测试类: @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) public class Candi
我这样写代码: @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) @RunWith(SpringJUnit
假设我更改了文件,然后进行 pull 。 Git 会报错,因为本地仓库还没有保存,将被覆盖。如果我然后删除该添加并使文件与以前相同(与远程 repo 相同),那么会发生 pull 吗? 最佳答案 是的
我正在阅读《Java for Dummies》一书,但遇到了问题。我不明白为什么 @Override 不起作用。我确信这与我的代码有关,因为我之前已经获得了一个多态数组来使用覆盖,但它对我来说太简单了
我从我的项目中提取了这段代码,因为我试图找到我犯的一个错误,该错误使我的 BeginStoryboard 无法自行停止。我尽可能地简化了代码,但仍然没有发现问题。你认为它可能是什么?
这个问题在这里已经有了答案: Difference between char[] and char * in C [duplicate] (3 个答案) 关闭 7 年前。 我想我知道自己问题的答案,
我一直在使用 java 的 Scanner 类时遇到问题。我可以让它很好地读取我的输入,但问题是当我想要输出一些东西时。给定多行输入,我想在完全读取所有输入后只打印一行。这是我用来读取输入的代码:
对于这个问题,我已经用最简单的术语表达了这一点。 如果元素被点击,'active'类被添加到元素,'active'类从其他元素中移除。 但是,如果该元素是“事件的”并且它被第二次单击,则“事件”类不应
这会在桌面上创建一个新文件夹,但不会将文件夹 .pfrom 的内容 move 到文件夹 .pTo。 int main() { SHFILEOPSTRUCT sf = {0}; TCHA
我有一个关于多线程调试 DLL (/MDd) 和多线程调试 (/MTd) 设置的问题。它们之间的区别很明显:一个是使用动态库,一个是使用静态库。当我使用/MDd 编译我的程序时,一切都进行得很好。但是
我的问题是,如果我在页面加载时创建一个克隆变量,jQuery 只会 append 它一次。奇怪! Click to copy This is an element! $(document)
所以...我是一个开发 django 应用程序的新手,但是当我尝试通过 virtualbox heroku 运行 heroku run python manage.py syncdb 时,它一直在下面
我在 Spring Boot 初始化时遇到了问题。我在一个简单的 Spring Boot 项目中有这个结构。 com.project.name |----App.java (Annoted with
我在 www.7hermanosmx.com/menu.php 页面上有以下代码 - 一切正常,除了黄色框(类 menuholder)应该每行三个相互 float 。他们坚决拒绝这样做!我知道我做错了
我正在尝试在我正在构建的小型网站上添加一个下拉菜单。出于某种原因,我可以获得我想要向下滑动到 fadeOut() 的 div 并执行其他类似的操作,但我无法将它获取到 slideDown()。我不知道
我有一个不能正确 float 的 div。当您切换可见性时,它会覆盖一些当前文本,但我可以稍后移动它。只是好奇为什么它不能正确 float ! Simple Tabs with CSS &am
我是一名优秀的程序员,十分优秀!