关于Color 的Xml序列化

laorer 2009-03-02 02:44:47


public Color LeftColor{
get;
set;
}

这样序列化后, LeftColor 在xml文件中为 null,
网上找了一下,说Color直接序列化是不行的,需要转换成 String 或者 int ,但我不清楚如果在序列化的过程中转换,
下面链接谈了一些,但没具体谈到什么, 是不是要实现XmlSerializable 接口,http://www.cnblogs.com/surfsky/archive/2009/02/19/673620.html


...全文
287 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
laorer 2009-03-02
  • 打赏
  • 举报
回复
谢谢,不知道为什么,我转化成 xml 文件时,似乎不还是不能得到结果,现在考虑另一种方式了,建两面个属性,一个是 Color (类型是Color,前面加上[XmlIgnore]), 另一个是 HtmlColor(类型是String, 前面加上[XmlElement("Color")] ),
只是如果有多个 属性的话,需要重复多个.....

北京的雾霾天 2009-03-02
  • 打赏
  • 举报
回复
呵呵,那就这样了:

[Serializable]
public class ClassA : ISerializable
{
private string str_;
private Color m_aa;
private int num_;
private DateTime overdueTime;

public ClassA()
{
}
protected ClassA(SerializationInfo info, StreamingContext context)
{
this.str_ = info.GetString("str");
this.num_ = info.GetInt32("num_");
this.m_aa.A = info.GetInt32("colorA");
this.m_aa.R = info.GetInt32("colorR");
this.m_aa.G = info.GetInt32("colorG");
this.m_aa.B = info.GetInt32("colorB");

//this.m_aa=Color.FromArgb(info.GetInt32("color"); 或者
}
public ClassA(string myStr, int myNum)
{
str_ = myStr;
num_ = myNum;
this.overdueTime = DateTime.Now;
}
public string Str
{
get { return str_; }
set
{
str_ = value;
}
}
public int Num
{
get { return num_; }
set
{
this.num_ = value;
}
}

public DateTime OverdueTime
{
get { return overdueTime; }
set { overdueTime = value; }
}
public Color AA
{
get{
return this.m_aa;
}
set {
this.m_aa = value;
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("str", str_);
info.AddValue("num_", num_);
info.AddValue("colorA", this.m_aa.A);
info.AddValue("colorR", this.m_aa.R);
info.AddValue("colorG", this.m_aa.G);
info.AddValue("colorB", this.m_aa.B);
//info.AddValue("color", this.m_aa.ToArgb()); 或者
}
}
public class Program1
{
static void Main(string[] args)
{
ClassA ca = new ClassA("Hello ", 10);
XmlSerializer xSerial = new XmlSerializer(typeof(ClassA));

//StreamReader reader = new StreamReader(@"D:\temp\po.xml ");
//object obj = xSerial.Deserialize(reader);

//StreamWriter write = new StreamWriter(@"D:\temp\po.xml ");
//xSerial.Serialize(write, ca);//为什么串行化不了值

//or use BinaryFormatter
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(@"D:\temp\po.xml", FileMode.Open, FileAccess.Read, FileShare.None);
//formatter.Serialize(stream, ca);
object obj = formatter.Deserialize(stream);
stream.Close();
}
}
laorer 2009-03-02
  • 打赏
  • 举报
回复
不好意思,还是没清楚,如果我 把 private object m_aa;

改成 private Color m_color; 并将其放入序列化中,该如何做?
laorer 2009-03-02
  • 打赏
  • 举报
回复
谢谢,我试试看
北京的雾霾天 2009-03-02
  • 打赏
  • 举报
回复
1:如果类没有添加可序列化的属性则添加上:[Serializable]
2:如果类本身不能被正确的序列化,则继承ISerializable接口,自己来定义类的序列化,比如:

[Serializable]
public class ClassA : ISerializable
{
private string str_;
private object m_aa;
private int num_;
private DateTime overdueTime;

public ClassA()
{
}
protected ClassA(SerializationInfo info, StreamingContext context)
{
this.str_ = info.GetString("str");
this.num_ = info.GetInt32("num_");
}
public ClassA(string myStr, int myNum)
{
str_ = myStr;
num_ = myNum;
this.overdueTime = DateTime.Now;
}
public string Str
{
get { return str_; }
set
{
str_ = value;
}
}
public int Num
{
get { return num_; }
set
{
this.num_ = value;
}
}

public DateTime OverdueTime
{
get { return overdueTime; }
set { overdueTime = value; }
}
public object AA
{
get
{
return this.m_aa;
}
set {
this.m_aa = value;
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("str", str_);
info.AddValue("num_", num_);
}
}
public class Program1
{
static void Main(string[] args)
{
ClassA ca = new ClassA("Hello ", 10);
XmlSerializer xSerial = new XmlSerializer(typeof(ClassA));

//StreamReader reader = new StreamReader(@"D:\temp\po.xml ");
//object obj = xSerial.Deserialize(reader);

//StreamWriter write = new StreamWriter(@"D:\temp\po.xml ");
//xSerial.Serialize(write, ca);//为什么串行化不了值

//or use BinaryFormatter
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(@"D:\temp\po.xml", FileMode.Open, FileAccess.Read, FileShare.None);
//formatter.Serialize(stream, ca);
object obj = formatter.Deserialize(stream);
stream.Close();
}
}
icehawk 2009-03-02
  • 打赏
  • 举报
回复
int icolor = ColorTranslator.ToWin32(acolor).ToString();
Color color = ColorTranslator.FromWin32(icolor);

1,978

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧