CompactFormatter序列化

wxxloveu 2009-12-09 03:23:53
..
...全文
1356 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxxloveu 2009-12-14
  • 打赏
  • 举报
回复
。。
danjiewu 2009-12-14
  • 打赏
  • 举报
回复
序列化和反序列化要求类型的定义必须完全一致,可以认为服务端和客户端都要包含相同的assembly也就是dll文件。
WinCE序列化得到的byte数组不能保证在PC上能反序列化成功,因为.Net Framework和.Net CF是不一样的。如果一定要尝试,把你编译得到的WinCE工程里的dll引用到服务端试下。
用XmlSerializer是可以的。

wxxloveu 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 qldsrx 的回复:]
教你一个测试的方法,在服务器端和客户端都用File.WriteAllBytes方法将byte[]输出到文件,看看传输后是否还和原来的一致了,通过这种方法还可以看到序列化XML是否成功。
[/Quote]
一致哦,两边的byte[]都一样啊
qldsrx 2009-12-11
  • 打赏
  • 举报
回复
那我就更加奇怪了,你居然可以序列化成功,而在我这里运行直接报错,无法序列化。
wxxloveu 2009-12-11
  • 打赏
  • 举报
回复
。。
myhid 2009-12-11
  • 打赏
  • 举报
回复
楼主请使用CompactFormatterPlus,这个是CF的最新版
qldsrx 2009-12-11
  • 打赏
  • 举报
回复
问题就在你的System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(MessageBase));
中了,你的MessageBase不含有Password 和FromUserName 的定义,序列化结构初始化时取的是MessageBase的结构,你认为有可能把这两个属性给序列化吗?
ser.Serialize(ms, msg);里面的msg用MessageBase传递没有问题,只要它本身是用C2S_LoginMessage初始化的,用基类传递不会有问题,关键是XmlSerializer在初始化时不能用MessageBase
wxxloveu 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 builderc 的回复:]
我也建议你就用基类就得了,用不着这么深的继承关系。
可以把这个基类做得大一些,属性多一些。 用我提供的例子,进行序列化和反序列化

不使用带参数的构造函数。用赋值传入的办法传入属性值
反序列化,再实例化就可以直接获得有属性值的对象
[/Quote]
呵呵,这样也应该可以,只是在服务器端收到消息后怎么去判断客户端发的什么消息呢?我的设计是根据不同消息类型做不同的响应的
wxxloveu 2009-12-11
  • 打赏
  • 举报
回复
。。
trentliu 2009-12-11
  • 打赏
  • 举报
回复
我也建议你就用基类就得了,用不着这么深的继承关系。
可以把这个基类做得大一些,属性多一些。 用我提供的例子,进行序列化和反序列化

不使用带参数的构造函数。用赋值传入的办法传入属性值
反序列化,再实例化就可以直接获得有属性值的对象
qldsrx 2009-12-11
  • 打赏
  • 举报
回复
TO #48楼:
你这样做有何意义?假如你序列化用基类的结构,而基类中是没有派生类的成员信息的,就算你继承IXmlSerializable也是无法获取派生类的成员信息的,那样是没法序列化保存派生类的信息的。反过来在反序列化时,如果你用基类来接收数据成员信息,由于基类中不含有派生类的成员,那么派生类中成员的信息是无法被传递,这样又失去了意义。而且一旦得到了基类,你还是不能作为派生类使用,因为无法从基类强制类型转换到派生类的。
wxxloveu 2009-12-11
  • 打赏
  • 举报
回复
。。
qldsrx 2009-12-11
  • 打赏
  • 举报
回复
都说了是你的类的问题了,你虽然继承了IXmlSerializable,但是没有实现ReadXml方法,而且WriteXml方法也是错误的,那样怎么可能序列化成功,最简单的方法如下,只要修改两个属性的访问权限即可。
    public class C2S_LoginMessage : C2S_MessageBase
{
/// <summary>
/// Password
/// </summary>
private string _password;

/// <summary>
/// Login Message
/// </summary>
/// <param name="username">username</param>
/// <param name="password">password</param>
public C2S_LoginMessage(string username, string password)
: base(username)
{
this._password = password;//Do checking password next time
}
/// <summary>
/// Password
/// </summary>


public string Password
{
get { return _password; }
set { _password = value; }
}

public C2S_LoginMessage()
{

}

}


/// <summary>
/// The base of C2S_Message
/// </summary>
public abstract class C2S_MessageBase : MessageBase
{
/// <summary>
/// From username
/// </summary>
private string _fromUserName;
/// <summary>
/// C2S Message
/// </summary>
/// <param name="fromUserName">from username(usually to clientXP)</param>
public C2S_MessageBase(string fromUserName)
{
this._fromUserName = fromUserName;
}
/// <summary>
/// from username
/// </summary>
public string FromUserName
{
get { return _fromUserName; }
set { _fromUserName = value; }
}

public C2S_MessageBase()
{ }
}


/// <summary>
/// The base of Message(include C2S, S2C, P2P Message)
/// <para> Write by Cincin in ZDTII</para>
/// <para> 2009-12-05</para>
/// </summary>
public class MessageBase
{
//do nothing
public MessageBase()
{ }
}
wxxloveu 2009-12-11
  • 打赏
  • 举报
回复
。。。
qldsrx 2009-12-11
  • 打赏
  • 举报
回复
我测试下……
trentliu 2009-12-11
  • 打赏
  • 举报
回复


[Serializable]
public class User
{
private string _id;
public String Id
{
get
{
return _id;
}
set
{
_id = value;
}
}

public User()
{

}


}



private void button1_Click(object sender, EventArgs e)
{
MemoryStream stream = new MemoryStream();
User user = new User();
user.Id = "AA";

XmlSerializer xs = new XmlSerializer(typeof(User));
xs.Serialize(stream, user);

stream.Position = 0;

XmlSerializer xs1 = new XmlSerializer(typeof(User));
User user1 = xs1.Deserialize(stream) as User;

}
wxxloveu 2009-12-11
  • 打赏
  • 举报
回复
。。
wxxloveu 2009-12-11
  • 打赏
  • 举报
回复
。。
qldsrx 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 wxxloveu 的回复:]
xml序列化不能反序列化为其基类类型??
[/Quote]
Object类没有提供XML序列化方法,如果是一个有具体XML序列化方法的基类,那是可以的,最多就是丢失不存在于基类的属性,其反序列化的基本原则是,先new一个你指定的对象,然后从xml文件中按照给定格式对指定对象成员赋值,所以你的类必须具有public属性的成员,否则反序列化时无法给它赋值。
qldsrx 2009-12-11
  • 打赏
  • 举报
回复
你的C2S_LoginMessage长什么样,能否序列化成功全看C2S_LoginMessage的长相。
加载更多回复(50)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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