我有一个带有子类的自定义抽象基类,我已经使用ISerializable进行了可序列化/可序列化.当我对这个类的子类的单个实例进行序列化/反序列化时,一切正常.但是,当我做一个数组时,我总是在反序列化时得到一个空数组.使用BinaryFormatter完成序列化.
这些项目包含在:
public ObservableCollection<Trade> Trades { get; private set; }
Run Code Online (Sandbox Code Playgroud)
在序列化时,这是在SerializationInfo参数的GetObjectData中完成的:
Trade[] trades = (Trade[])Trades.ToArray<Trade>();
info.AddValue("trades", trades);
Run Code Online (Sandbox Code Playgroud)
在反序列化时,这也是在SerializationInfo参数的序列化构造函数中完成的:
Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[]));
foreach (Trade t in trades)
{
Trades.Add(t);
}
Run Code Online (Sandbox Code Playgroud)
反序列化总是给我一个空数组,正如我前面提到的,单个项目序列化和deseriaizes与这段代码很好:
序列化(GetObjectData方法):
info.AddValue("trade", Trades.First<Trade>());
Run Code Online (Sandbox Code Playgroud)
反序列化(序列化构造函数):
Trade t = (Trade)info.GetValue("trade", typeof(Trade));
Trades.Add(t);
Run Code Online (Sandbox Code Playgroud)
这是个常见的问题吗?我似乎发现至少没有其他任何人参与其中.希望有一个解决方案:)如果我需要为您提供更多信息/代码,请告诉我.
谢谢!
我正在尝试对对象进行自定义序列化/反序列化,以及使用DeflateStreams压缩/解压缩序列化数据.我最初为更复杂的对象做了这个,但是把它剪下来试图找出问题,然而它变得更加令人费解,因为它仍然存在.这是要序列化/反序列化的类:
[Serializable]
public class RandomObject : ISerializable
{
public String Name { get; set; }
public String SavePath { get; set; }
public RandomObject()
{
}
public RandomObject(String name, String savepath)
{
Name = name;
SavePath = savepath;
}
public RandomObject(SerializationInfo info, StreamingContext context)
: this(info.GetString("name"), info.GetString("savepath"))
{
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("name", Name);
info.AddValue("savepath", SavePath);
}
}
Run Code Online (Sandbox Code Playgroud)
这里是应该序列化它的代码(似乎工作):
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, …Run Code Online (Sandbox Code Playgroud) 我正在努力保存更大的对象结构,其中包含我正在处理的应用程序中"项目"所需的所有数据.数据是诸如图片,流文档以及更基本的数据类型之类的东西.
现在,我目前的方法是在我需要保存的对象中包含的所有类上实现ISerializable.但是,当:
public class Profile : ISerializable
{
public ObservableCollection<Trade> Trades { get; set; }
public Profile() {}
public Profile(SerializationInfo info, StreamingContext context)
: this()
{
foreach (SerializationEntry entry in info)
{
if (entry.Name.StartsWith("trade"))
{
Type t = entry.ObjectType;
Trades.Add(entry.Value as Trade);
}
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
int i = 0;
foreach (Trade t in Trades)
{
info.AddValue("trade" + i, t, t.GetType());
i++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它造成了一个问题.填充我的List的Trade-class也实现了ISerializable.所以我很想知道:这是一个好方法吗?它甚至有用吗?我到目前为止编写的代码不起作用,我仍在尝试解决这些问题.
更具体地说,将是info.AddValue("trade"+ i,t,t.GetType()); 使用贸易级的ISerializable方法?或许这个界面甚至不打算处理这些类型的类.
因此,如果有人会如此善良,并采取一些看法,并指出我在这些事情的序列化方面的正确方向.
谢谢!
我一直在尝试序列化和反序列化BitmapImages.我一直在使用我认为在这个线程中找到的方法:我的byte []错误到WPF BitmapImage转换?
只是为了迭代正在发生的事情,这是我的序列化代码的一部分:
using (MemoryStream ms = new MemoryStream())
{
// This is a BitmapImage fetched from a dictionary.
BitmapImage image = kvp.Value;
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(ms);
byte[] buffer = ms.GetBuffer();
// Here I'm adding the byte[] array to SerializationInfo
info.AddValue((int)kvp.Key + "", buffer);
}
Run Code Online (Sandbox Code Playgroud)
这是反序列化代码:
// While iterating over SerializationInfo in the deserialization
// constructor I pull the byte[] array out of an
// SerializationEntry
using (MemoryStream ms = new MemoryStream(entry.Value as byte[]))
{ …Run Code Online (Sandbox Code Playgroud)