我正在尝试序列化我类(class)的一个领域。没有它序列化很好,有它一个 get SerializationException。
字段是:private readonly ObservableCollection<CellVM> Values;
异常(exception)是
Type System.ComponentModel.PropertyChangedEventManager in assembly WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 is not marked as serializable.
我的目标是 Framework 3.5。
我发现了一些建议,它可能是可观察集合的序列化问题,但应该在 3.5 sp1 中修复。
不知道如何解决这个问题,有什么想法吗?谢谢。
CellVM 类:
[Serializable]
public class CellVM:ANotifyPropertyChanged
{
public Cell model;
public int X
{
get { return model.X; }
set { model.X = value; OnPropertyChanged("X"); }
}
public int Y
{
get { return model.Y; }
set { model.Y = value; OnPropertyChanged("Y"); }
}
public string Value
{
get
{
return model.ActualValue;
}
set { model.ActualValue = value; OnPropertyChanged("Value"); }
}
[NonSerialized]
private bool _isActive;
public bool IsActive
{
get
{
return _isActive;
}
set
{
_isActive = value;
OnPropertyChanged("IsActive");
OnPropertyChanged("BackgroundBrush");
OnPropertyChanged("HighlightBrush");
}
}
public bool IsReadOnly
{
get
{
if(model.InitialValue.Equals(model.RightValue))
{
return true;
}
return false;
}
}
public bool IsHighLighted
{
get;
set;
}
private bool _isInvalid;
public bool IsInvalid
{
get { return _isInvalid; }
set
{
_isInvalid = value;
OnPropertyChanged("IsInvalid");
OnPropertyChanged("BackgroundBrush");
}
}
private bool _isValueMode;
public bool IsValueMode
{
get
{
return _isValueMode;
}
set
{
_isValueMode = value;
OnPropertyChanged("IsValueMode");
OnPropertyChanged("ValueVisibility");
OnPropertyChanged("PossibilityVisibility");
}
}
[NonSerialized]
private FontWeight _valueFontWeight;
public FontWeight ValueFontWeight
{
get
{
return _valueFontWeight;
}
set { _valueFontWeight = value; OnPropertyChanged("ValueFontWeight");}
}
[NonSerialized]
private Brush _valueColor;
public Brush ValueColor
{
get
{
if(_valueColor == null)
{
return new SolidColorBrush(Colors.Black);
}
return _valueColor;
}
set { _valueColor = value; OnPropertyChanged("ValueColor"); }
}
public Visibility ValueVisibility
{
get
{
if(IsValueMode)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility PossibilityVisibility
{
get
{
if (!IsValueMode)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
private bool _isCheckInvalid;
public bool IsCheckInvalid
{
get
{
return _isCheckInvalid;
}
set
{
_isCheckInvalid = value;
OnPropertyChanged("IsCheckInvalid");
OnPropertyChanged("HighlightBrush");
}
}
public Brush HighlightBrush
{
get
{
if(IsActive && IsReadOnly)
{
return ColorManager.CellActive;
}
if (IsCheckInvalid)
{
ColorAnimation animation = new ColorAnimation
{
From = Colors.Firebrick,
To = Colors.WhiteSmoke,
Duration = new Duration(TimeSpan.FromSeconds(1)),
AutoReverse = true
};
SolidColorBrush brush = new SolidColorBrush(Colors.Firebrick);
animation.RepeatBehavior = RepeatBehavior.Forever;
animation.AccelerationRatio = 0.5;
brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);
return brush;
}
return new SolidColorBrush(Colors.Transparent);
}
}
public Brush BackgroundBrush
{
get
{
if (IsActive)
{
if (!IsReadOnly)
{
return ColorManager.CellActive;
}
}
if (IsInvalid)
{
return ColorManager.CellInvalid;
}
if (IsHighLighted)
{
return ColorManager.CellHighlighted;
}
return new SolidColorBrush(Colors.White);
}
}
[NonSerialized]
private Brush _backgroundAnimationBrush;
public Brush BackgroundAnimationBrush
{
get { return _backgroundAnimationBrush; }
set { _backgroundAnimationBrush = value; OnPropertyChanged("BackgroundAnimationBrush"); }
}
public Brush PossibilitiesBrush
{
get
{
return new SolidColorBrush(PossibilitiesColor);
}
}
private Colour _possibilitiesColor;
public Colour PossibilitiesColor
{
get
{
if (_possibilitiesColor == null)
{
return new Colour(Colors.Black);
}
return _possibilitiesColor;
}
set
{
_possibilitiesColor = value;
OnPropertyChanged("PossibilitiesColor");
OnPropertyChanged("PossibilitiesBrush");
}
}
public ObservableCollection<string> Possibilities
{
get { return model.Possibilities; }
set
{
model.Possibilities = value;
OnPropertyChanged("Possibilities");
OnPropertyChanged("PossibilityVisibility");
}
}
private string _toolTip;
public string ToolTip
{
get { return _toolTip; }
set { _toolTip = value; OnPropertyChanged("ToolTip"); }
}
public CellVM(Cell model,bool isHighlighted)
{
this.model = model;
IsValueMode = true;
IsHighLighted = isHighlighted;
}
public void signalError(string message)
{
ToolTip = message;
IsInvalid = true;
}
public void resetError()
{
if(IsCheckInvalid)
{
return;
}
ToolTip = null;
IsInvalid = false;
}
public void AnimateError()
{
ColorAnimation animation = new ColorAnimation
{
From = Colors.Firebrick,
To = Colors.Transparent,
Duration = new Duration(TimeSpan.FromSeconds(1.5)),
AutoReverse = false
};
animation.Completed += new EventHandler(animation_Completed);
SolidColorBrush brush = new SolidColorBrush(Colors.Transparent);
animation.AccelerationRatio = 0.5;
BackgroundAnimationBrush = brush;
brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);
}
public void AnimateHint()
{
ColorAnimation animation = new ColorAnimation
{
From = Colors.DarkGreen,
To = Colors.Transparent,
Duration = new Duration(TimeSpan.FromSeconds(1.5)),
AutoReverse = false
};
animation.Completed += new EventHandler(animation_Completed);
SolidColorBrush brush = new SolidColorBrush(Colors.Transparent);
animation.AccelerationRatio = 0.5;
BackgroundAnimationBrush = brush;
brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);
}
private void animation_Completed(object sender, EventArgs e)
{
BackgroundAnimationBrush = null;
}
}
CellVM 父类(super class)(祖先):
[Serializable]
public abstract class ANotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
}
最佳答案
尝试通过 [NonSerialized] 属性标记事件 PropertyChanged
下面是事件的语法:(参见 MSDN)
[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;
关于c# - 序列化实现 INotifyPropertyChanged 的类的实例时出现 SerializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8879426/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co