我在尝试使用protobuf-net序列化/反序列化复杂对象图时遇到了一些问题.
我正在研究遗留应用程序,我们正在使用.Net Remoting将GUI客户端连接到C#服务.由于使用默认值的对象图的序列化大小,我们看到海外用户的性能不佳BinaryFormatter,客户端和服务器之间的有限带宽(1Mbit/s)加剧了这种情况.
作为一个快速的胜利,我想我已经汇总了一个概念证明,通过实施,使用protobuf-net代替是否有任何性能提升ISerializable.在测试时,我遇到了一个问题,即没有维护对象引用.
我汇总了一个重新解决问题的例子.我期待Dictionary(Items [1])和对象BA中的对象与我AsReference=true在ProtoMember属性中指定的对象相同 .
使用protobuf-net 2.0.0.619,我看到反序列化时引发的异常(反序列化过程中引用跟踪对象更改了引用).
如果这不是支持的方案,请告诉我.
测试
[Test]
public void AreObjectReferencesSameAfterDeserialization()
{
A a = new A();
B b = new B();
b.A = a;
b.Items.Add(1, a);
Assert.AreSame(a, b.A);
Assert.AreSame(b.A, b.Items[1]);
B deserializedB;
using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, b);
stream.Seek(0, SeekOrigin.Begin);
deserializedB = Serializer.Deserialize<B>(stream);
}
Assert.AreSame(deserializedB.A, deserializedB.Items[1]);
}
Run Code Online (Sandbox Code Playgroud)
类定义
[Serializable]
[ProtoContract]
public class A
{
}
[Serializable]
[ProtoContract]
public class B …Run Code Online (Sandbox Code Playgroud) 我有两个流.一个是数据流(可以是任何类型),另一个是充当门的布尔流.我需要将这些组合成一个具有以下行为的流:
我不太确定如何将它们放在一起.我一直在测试的输入是这样的:
// a demo data stream that emits every second
var dataStream = Observable.Interval(TimeSpan.FromSeconds(1));
// a demo flag stream that toggles every 5 seconds
var toggle = false;
var gateStream = Observable.Interval(TimeSpan.FromSeconds(5))
.Select(_ => toggle = !toggle);
Run Code Online (Sandbox Code Playgroud) 我们从头开始创建了一个新的,相当复杂的WPF应用程序,并且随着CommandManager注册的命令数量的增加而遇到性能问题.我们在MVVM实现中使用简单的轻量级命令,但是我们正在使用的第三方控件(Infragistics)没有,并且自由地调用CommandManager.RegisterClassCommandBinding来添加RoutedCommands.性能问题表现为在响应用户输入时UI中的感觉迟缓,例如控件之间的标签缓慢,文本输入是"生涩"而弹出动画是"笨重的".当应用程序第一次启动时,UI很快.随着更多包含Infragistics网格的屏幕打开,性能会下降.
在内部,CommandManager有一个名为_requerySuggestedHandlers的私有字段,它是List <WeakReference>.我用反射来获取对这个集合的引用,我注意到当我调用.Clear()时,UI的响应性会提升回初始状态.显然我不想去清理那些我知之甚少的收藏品,特别是使用反射(!),但我这样做是为了看看它是否能解决性能问题,并且瞧它了.
通常情况下,这种情况会在经过一段时间后自行清理.但是,WeakReferences(_requerySuggestedHandlers)的集合只会在启动垃圾收集后进行修剪,这是不确定的.因此,当我们关闭包含网格的窗口(Infragistics XamDataGrid)时,在窗口关闭很久之后,"死"网格命令的CanExecute属性将继续被不必要地评估.这也意味着如果我们关闭了许多窗口,性能仍然缓慢,直到启动垃圾收集.我知道这可能发生在分配上,而且我已经看到了自己,因为如果我打开另一个窗口,这会导致初始内存(来自处置的Windows)被收集并且性能恢复正常.
所以,鉴于上述情况,以下是我的问题:
谢谢!
我在我的WPF应用程序中发现了一个与MultiDataTrigger相关的一个有趣的问题,它没有启动StoryBoard来为数据网格单元设置动画.我有一个WPF数据网格控件绑定到包含实现INotifyPropertyChanged的POCO的ObservableCollection.
一个实时数据网格,随着值的变化闪烁更新.当值增加时,我希望单元格闪烁绿色; 当值减小时,我希望单元格闪烁红色.动画仅在1秒间隔内将单元格的背景颜色从纯色动画显示为透明.
第一次使用后,MultiDataTrigger不会启动故事板.MultiDataTrigger正在监视对两个属性的更改:IsPositive和HasValueChanged.最初HasValueChanged为false,稍后在设置Value属性后将false从false更改为true,并且动画第一次起作用.此后,HasValueChanged从false变为true以触发更改通知,但动画未启动.
这是我正在应用于每个数据网格单元的XAML样式:
<Style TargetType="{x:Type TextBlock}">
<Style.Setters>
<Setter Property="Background"
Value="Aqua" />
</Style.Setters>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=HasValueChanged}"
Value="True" />
<Condition Binding="{Binding Path=IsPositive}"
Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="PositiveValueCellStoryboard" />
<RemoveStoryboard BeginStoryboardName="NegativeValueCellStoryboard" />
<BeginStoryboard Name="PositiveValueCellStoryboard"
Storyboard="{StaticResource PositiveValueCellAnimation}"
HandoffBehavior="SnapShotAndReplace" />
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=HasValueChanged}"
Value="True" />
<Condition Binding="{Binding Path=IsPositive}"
Value="False" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="PositiveValueCellStoryboard" />
<RemoveStoryboard BeginStoryboardName="NegativeValueCellStoryboard" />
<BeginStoryboard Name="NegativeValueCellStoryboard"
Storyboard="{StaticResource NegativeValueCellAnimation}"
HandoffBehavior="SnapShotAndReplace" />
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
这是动画的XAML:
<Storyboard x:Key="NegativeValueCellAnimation">
<ColorAnimation Storyboard.TargetProperty="Background.(SolidColorBrush.Color)" …Run Code Online (Sandbox Code Playgroud)