반응형

if ($.browser.msie) {
    $
(".audio").prepend($("<embed>").attr({
       
'src':'/resources/voices/'+voice+'.wav',
       
'HIDDEN':'true',
       
'AUTOSTART':'true'
   
}));
}else if($.browser.safari){
    $
(".audio").removeAttr("style");
    $
(".audio").prepend($("<object></object>").attr({
       
'type':'audio/x-wav',
       
'data':'/resources/voices/'+voice+'.wav',
       
'width':'0',
       
'height':'0'
   
}));
    $
("object:first").prepend($("<param>").attr({
       
'name':'autoplay',
       
'value':'true'
   
}));
}else{
    $
(".audio").prepend($("<audio></audio>").attr({
       
'src':'/resources/voices/'+voice+'.wav',
       
'volume':0.4,
       
'autoplay':'autoplay'
   
}));
}

Posted by 1010
반응형

The purpose of the <object> element is to support HTML helpers (plug-ins).


HTML Helpers (Plug-ins)

A helper application is a small computer program that extends the standard functionality of the browser. Helper applications are also called plug-ins.

Plug-ins are often used by browsers to play audio and video.

Examples of well-known plug-ins are Adobe Flash Player and QuickTime.

Plug-ins can be added to Web pages through the <object> tag or the <embed> tag. 

Most plug-ins allow manual (or programmed) control over settings for volume, rewind, forward, pause, stop, and play.


What is The Best Way to Play Audio/Video in HTML?

For the best way to embed audio or video in your Web page, please read the next chapters.


QuickTime - Play WAV Audio

Example

<object width="420" height="360"
classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
codebase="http://www.apple.com/qtactivex/qtplugin.cab">
<param name="src" value="liar.wav">
<param name="controller" value="true">
</object>

Try it yourself »


 


QuickTime - Play MP4 Video

Example

<object width="420" height="360"
classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
codebase="http://www.apple.com/qtactivex/qtplugin.cab">
<param name="src" value="movie.mp4">
<param name="controller" value="true">
</object>

Try it yourself »


 


Adobe Flash Player - Play SWF Video

Example

<object width="400" height="40"
classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://fpdownload.macromedia.com/
pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0">
< param name="SRC" value="bookmark.swf">
< embed src="bookmark.swf" width="400" height="40">
< /embed>
< /object>

Try it yourself »


 


Windows Media Player - Play WMV Movie

The example below shows the suggested code used to display a Windows Media file.

Example

<object width="100%" height="100%"
type="video/x-ms-asf" url="3d.wmv" data="3d.wmv"
classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6">
<param name="url" value="3d.wmv">
<param name="filename" value="3d.wmv">
<param name="autostart" value="1">
<param name="uiMode" value="full">
<param name="autosize" value="1">
<param name="playcount" value="1">
<embed type="application/x-mplayer2" src="3d.wmv" width="100%" height="100%" autostart="true" showcontrols="true" pluginspage="http://www.microsoft.com/Windows/MediaPlayer/"></embed>
</object>

Try it yourself »


 


Plug-ins

Plug-ins can be used for many purposes: to display maps, scan for viruses, verify your bank id, and much more. The restrictions are few.

 

출처 : http://www.w3schools.com/html/html_object.asp

Posted by 1010
반응형

[jQuery] 제이쿼리(jQuery) 플러그인 목록 모음입니다.

 

해당 소스는 라이선스 조건을 확인한 다음에 사용해주세요^^ 라이센스 정보 보기

 

-BACKGROUND-

 

[jQuery] 001. 백그라운드 이미지를 활용 할 수 있는 제이쿼리 [다운받기][미리보기]

[jQuery] 002. 백그라운드에 영상을 제어하는 제이쿼리입니다.[다운받기][미리보기]

[jQuery] 003. 스크롤과 버튼을 통한 백그라운드 제어하기 [다운받기][미리보기]

[jQuery] 004. 다양한 옵션에 따라 백그라운드 이미지 조절하기 [다운받기][미리보기]

[jQuery] 005. 페이지의 숨겨진 영역을 보여주는 페이지 슬라이드 [다운받기][미리보기]

[jQuery] 006. 백그라운드 배경을 기본으로 하는 이미지 갤러리 [다운받기][미리보기]

[jQuery] 007. 다양한 효과를 줄 수 있는 백그라운드 갤러리 [다운받기][미리보기]

[jQuery] 008. 화면 크기에 따라 변하는 풀 스크린 이미지 소스 [다운받기][미리보기]

[jQuery] 009. 마우스에 움직임에 따라 움직이는 배경 이미지들 [다운받기][미리보기]

 

 

-GALLERY-

 

[Gallery] 001. 여러가지 이미지를 볼 수 있는 라이크 박스 갤러리 [다운받기][미리보기]

[Gallery] 002. 썸네일 이미지와 디테일 이미지가 나오는 갤러리 [다운받기][미리보기]

[Gallery] 003. 썸네일 이미지와 풀스크린 이미지의 제이쿼리 갤러리 [다운받기][미리보기]

[Gallery] 004. 스폰서의 정보를 보여주는 플립효과의 갤러리 스타일 [다운받기][미리보기]

[Gallery] 005. 사진을 하나씩 보여주는 포토 갤러리 플러그인 제이쿼리 [다운받기][미리보기]

[Gallery] 006. 이미지 갤러리 벽을 형상화한 갤러리 스타일 소스 [다운받기][미리보기]

[Gallery] 007. 박스 갤러리 형태의 이미지 갤러리 제이쿼리 소스 [다운받기][미리보기]

[Gallery] 008. 독특한 장면 효과를 제공하는 COIN SLIDER 갤러리 [다운받기][미리보기]

[Gallery] 009. 반응형, 모바일, CSS3를 지원하는 Slides.js 갤러리 [다운받기][미리보기]

[Gallery] 010. 제이쿼리를 이용한 라이트 박스 갤러리 이미지 [다운받기][미리보기]

 


출처 : http://webstoryboy.tistory.com/1266#.Urka39qIrwc

Posted by 1010
반응형

 

 

jquery.browser.js

 

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
<script src="http://code.jquery.com/jquery-1.9.0.js"></script>
<script type="text/javascript" src="jquery.browser.js"></script>
<script type="text/javascript">
<!--
 function test(){
  $.browser.msie ? alert('Internet Explorer') : alert('Not Internet Explorer');
 }
//-->
</script>
 </head>

 <body>
  <input type="button" value="test" onclick="test();">
 </body>
</html>

Posted by 1010
반응형

request #16 from bitdeli-chef/master

Add a Bitdeli Badge to README
latest commit 083f5495e6
authored

Octocat-spinner-32 dist Added uglify task to grunt
Octocat-spinner-32 test Casperserver can now be stopped and finishes with no errors
Octocat-spinner-32 .gitignore Added node related stuff to gitignore
Octocat-spinner-32 Gruntfile.js Added test task for grunt
Octocat-spinner-32 MIT-LICENSE.txt Added license file from jQuery MIT LICENSE with acknowledgement for m…
Octocat-spinner-32 README.md Add a Bitdeli badge to README
Octocat-spinner-32 bower.json Bumped version to 0.0.5
Octocat-spinner-32 browser.jquery.json Bumped version to 0.0.5
Octocat-spinner-32 package.json Added test task for grunt

README.md

A jQuery plugin for browser detection. jQuery removed support for browser detection on 1.9.1 so it was abstracted into a jQuery plugin

Installation

Include script after the jQuery library:

<script src="/path/to/jquery.browser.js"></script>

Usage

Returns true if the current useragent is some version of Microsoft's Internet Explorer. Supports all IE versions including IE11

$.browser.msie;

Returns true if the current useragent is some version of a Webkit browser (Safari, Chrome and Opera 15+).

$.browser.webkit;

Returns true if the current useragent is some version of Firefox.

$.browser.mozilla;

Reading the browser verion

$.browser.version

Things not included in the original jQuery $.browser implementation

  • Detect Windows, Mac, Linux, iPad, iPhone, Android and Windows Phone useragents
    $.browser.ipad
    $.browser.iphone
    $.browser["windows phone"]
    $.browser.android
    $.browser.win
    $.browser.mac
    $.browser.linux
  • Detect the browser's major version
    // User Agent for Chrome
    // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36

    $.browser.versionNumber // Returns 32 as a number
  • Support for new useragent on IE11
  • Support for webkit based Opera browsers
  • Added testing using PhantomJS and different browser user agents

Testing

Testing for this plugin is done with Casperjs v1.1 to take advantage of multiple phantomjs browsers with different user agents.

For instructions on how to install Casperjs v1.1 go to http://docs.casperjs.org/en/latest/installation.html

Note: Testing requires Casperjs v1.1

Install the grunt-cli dependency by running npm install -g grunt-cli Run npm install to install all dependencies including grunt and all tasks

Once Casperjs and the grunt-cli npm package is installed you can execute all the tests by using:

grunt test

Development

Attributions

 

$.browser.msie ? alert('Internet Explorer') : alert('Not Internet Explorer');

 

 

-----------------------------------------------

 

 

1. 브라우저 체크

 

$.browser.msie : 익스플로러인지를 확인. IE라면 true를 반환 아니라면 false를 반환합니다.
$.browser.mozilla : 파이어폭스인지 확인. 반환값은 위와 같습니다.
$.browser.safari : 사파리인지를 확인. 크롬의 경우도 해당합니다. 반환값은 위와 같습니다.
$.browser.opera : 오페라인지를 확인. 반환값은 위와 같습니다.


2. 브라우저 버전 체크

 

$.browser.version : 각각의 브라우저의 버전을 알아옵니다. 브라우저의 종류는 알아오지 않습니다.

 

3. 기본적인 사용 예제

 

$(function(){
  if($.browser.msie==true) {
    alert('인터넷 익스플로러를 사용 중 입니다. 버전은 '+$.browser.version+'입니다.');
  } else {
    alert('인터넷 익스플로러를 사용하고 있지 않습니다.');
  }
});

 

Posted by 1010
반응형

<!DOCTYPE html>
 <html>
 <body>

<object type="audio/x-wav" data="http://www.hydrotoys.com/wavs/Beavis_cornholio.wav" width="320" height="260">
<param name="autostart" value="true" />
<param name="controller" value="false" />
<param name="src" value="http://www.hydrotoys.com/wavs/Beavis_cornholio.wav">
</object>

<audio src="http://www.hydrotoys.com/wavs/Beavis_cornholio.wav" type="audio/x-wav" controls autoplay="autoplay">
<p>Your browser does not support the audio element </p>
<source src="http://www.hydrotoys.com/wavs/Beavis_cornholio.wav"/>
</audio>

</body>
</html>

출처 :http://stackoverflow.com/questions/12973877/autoplay-a-wav-file-on-html-code

 

Posted by 1010
98..Etc2013. 12. 23. 20:43
반응형

HTTP 상태 코드

위키백과, 우리 모두의 백과사전.

아래는 HTTP(하이퍼텍스트 전송 프로토콜) 응답 상태 코드의 목록이다.

IANA가 현재 공식 HTTP 상태 코드 레지스트리를 관리하고 있다.

 

1xx (조건부 응답)[편집]

요청을 받았으며 작업을 계속한다.[1]

  • 100(계속): 요청자는 요청을 계속해야 한다. 서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를 기다리고 있음을 나타낸다.
  • 101(프로토콜 전환): 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이다.
  • 102(처리, RFC 2518)

2xx (성공)[편집]

이 클래스의 상태 코드는 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.

  • 200(성공): 서버가 요청을 제대로 처리했다는 뜻이다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다.
  • 201(작성됨): 성공적으로 요청되었으며 서버가 새 리소스를 작성했다.
  • 202(허용됨): 서버가 요청을 접수했지만 아직 처리하지 않았다.
  • 203(신뢰할 수 없는 정보): 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고 있다.
  • 204(콘텐츠 없음): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다.
  • 205(콘텐츠 재설정): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않는다. 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구한다(예: 새 입력을 위한 양식 비우기).
  • 206(일부 콘텐츠): 서버가 GET 요청의 일부만 성공적으로 처리했다.
  • 207(다중 상태, RFC 4918)
  • 208(이미 보고됨, RFC 5842)
  • 226 IM Used (RFC 3229)

3xx (리다이렉션 완료)[편집]

클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.[1]

  • 300(여러 선택항목): 서버가 요청에 따라 여러 조치를 선택할 수 있다. 서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나, 요청자가 선택할 수 있는 작업 목록을 제공한다.
  • 301(영구 이동): 요청한 페이지를 새 위치로 영구적으로 이동했다. GET 또는 HEAD 요청에 대한 응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다.
  • 302(임시 이동): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
  • 303(기타 위치 보기): 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시한다. HEAD 요청 이외의 모든 요청을 다른 위치로 자동으로 전달한다.
  • 304(수정되지 않음): 마지막 요청 이후 요청한 페이지는 수정되지 않았다. 서버가 이 응답을 표시하면 페이지의 콘텐츠를 표시하지 않는다. 요청자가 마지막으로 페이지를 요청한 후 페이지가 변경되지 않으면 이 응답(If-Modified-Since HTTP 헤더라고 함)을 표시하도록 서버를 구성해야 한다.
  • 305(프록시 사용): 요청자는 프록시를 사용하여 요청한 페이지만 액세스할 수 있다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 하다.
  • 307(임시 리다이렉션): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
  • 308(영구 리다이렉션, RFC에서 실험적으로 승인됨)

4xx (요청 오류)[편집]

4xx 클래스의 상태 코드는 클라이언트에 오류가 있음을 나타낸다.

  • 400(잘못된 요청): 서버가 요청의 구문을 인식하지 못했다.
  • 401(권한 없음): 이 요청은 인증이 필요한다. 서버는 로그인이 필요한 페이지에 대해 이 요청을 제공할 수 있다.
  • 403(금지됨): 서버가 요청을 거부하고 있다.
  • 404(찾을 수 없음): 서버가 요청한 페이지를 찾을 수 없다. 예를 들어 서버에 존재하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공한다.
  • 405(허용되지 않는 방법): 요청에 지정된 방법을 사용할 수 없다.
  • 406(허용되지 않음): 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없다.
  • 407(프록시 인증 필요): 이 상태 코드는 401(권한 없음)과 비슷하지만 요청자가 프록시를 사용하여 인증해야 한다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 한다.
  • 408(요청 시간초과): 서버의 요청 대기가 시간을 초과하였다.
  • 409(충돌): 서버가 요청을 수행하는 중에 충돌이 발생했다. 서버는 응답할 때 충돌에 대한 정보를 포함해야 한다. 서버는 PUT 요청과 충돌하는 PUT 요청에 대한 응답으로 이 코드를 요청 간 차이점 목록과 함께 표시해야 한다.
  • 410(사라짐): 서버는 요청한 리소스가 영구적으로 삭제되었을 때 이 응답을 표시한다. 404(찾을 수 없음) 코드와 비슷하며 이전에 있었지만 더 이상 존재하지 않는 리소스에 대해 404 대신 사용하기도 한다. 리소스가 영구적으로 이동된 경우 301을 사용하여 리소스의 새 위치를 지정해야 한다.
  • 411(길이 필요): 서버는 유효한 콘텐츠 길이 헤더 입력란 없이는 요청을 수락하지 않는다.
  • 412(사전조건 실패): 서버가 요청자가 요청 시 부과한 사전조건을 만족하지 않는다.
  • 413(요청 속성이 너무 큼): 요청이 너무 커서 서버가 처리할 수 없다.
  • 414(요청 URI가 너무 긺): 요청 URI(일반적으로 URL)가 너무 길어 서버가 처리할 수 없다.
  • 415(지원되지 않는 미디어 유형): 요청이 요청한 페이지에서 지원하지 않는 형식으로 되어 있다.
  • 416(처리할 수 없는 요청범위): 요청이 페이지에서 처리할 수 없는 범위에 해당되는 경우 서버는 이 상태 코드를 표시한다.
  • 417(예상 실패): 서버는 Expect 요청 헤더 입력란의 요구사항을 만족할 수 없다.
  • 418(I'm a teapot, RFC 2324)
  • 420(Enhance Your Calm, 트위터)
  • 422(처리할 수 없는 엔티티, WebDAV; RFC 4918)
  • 423(잠김,WebDAV; RFC 4918)
  • 424(실패된 의존성, WebDAV; RFC 4918)
  • 424(메쏘드 실패, WebDAV)
  • 425(정렬되지 않은 컬렉션, 인터넷 초안)
  • 426(업그레이드 필요, RFC 2817)
  • 428(전제조건 필요, RFC 6585)
  • 429(너무 많은 요청, RFC 6585)
  • 431(요청 헤더 필드가 너무 큼, RFC 6585)
  • 444(응답 없음, Nginx)
  • 449(다시 시도, 마이크로소프트)
  • 450(윈도 자녀 보호에 의해 차단됨, 마이크로소프트)
  • 451(법적인 이유로 이용 불가, 인터넷 초안)
  • 451(리다이렉션, 마이크로소프트)
  • 494(요청 헤더가 너무 큼, Nginx)
  • 495(Cert 오류, Nginx)
  • 496(Cert 없음, Nginx)
  • 497(HTTP to HTTPS, Nginx)
  • 499(클라이언트가 요청을 닫음, Nginx)

5xx (서버 오류)[편집]

서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.[1]

  • 500(내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없다.
  • 501(구현되지 않음): 서버에 요청을 수행할 수 있는 기능이 없다. 예를 들어 서버가 요청 메소드를 인식하지 못할 때 이 코드를 표시한다.
  • 502(불량 게이트웨이): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았다.
  • 503(서비스를 사용할 수 없음): 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다. 이는 대개 일시적인 상태이다.
  • 504(게이트웨이 시간초과): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 제때 요청을 받지 못했다.
  • 505(HTTP 버전이 지원되지 않음): 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않는다.
  • 506(Variant Also Negotiates, RFC 2295)
  • 507(용량 부족, WebDAV; RFC 4918)
  • 508(루프 감지됨, WebDAV; RFC 5842)
  • 509(대역폭 제한 초과, Apache bw/limited extension)
  • 510(확장되지 않음, RFC 2774)
  • 511(네트워크 인증 필요, RFC 6585)
  • 598(네트워크 읽기 시간초과 오류, 알 수 없음)
  • 599(네트워크 연결 시간초과 오류, 알 수 없음)

출처 : http://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

Posted by 1010
98..Etc2013. 12. 23. 11:47
반응형

이 문서는 Gecko DOM 참고 자료의 목차입니다.

들면서

개요

DOM 요소 참고 자료

DOM window 참고자료

DOM document 참고자료

DOM event 참고자료

DOM style 참고자료

DOM range 참고자료

DOM selection 참고자료

DOM - 다른 객체

HTML Form 요소 인터페이스

HTML Table 요소 인터페이스

HTML Table Row 요소 인터페이스

DOM 예제

Posted by 1010
01.JAVA/Java2013. 12. 23. 11:43
반응형

객체 직렬화란?

- 직렬화: Heap에 위치한 객체를 출력 가능한 상태로 만드는 작업

- 역직렬화: 직렬화된 객체를 다시 Heap에 넣기 위한 작업

- 직렬화의 대상은 객체의 Attribute의 값. (메소드는 그저 주소값만 필요할뿐)

 

- 객체를 IO하기 위해서는 필터스트림인 ObjectInputStream과 ObjectOutputStream이 필요

- 직렬화는 ObjectOutputStream

- 역직렬화는 ObjectInputStream

- 직렬화 대상객체는 java.io.Serializable를 implements한 클래스 객체여야 한다.

 



 

- 자바의 메모리 구조는 그림과 깉이 되있는데 여기서 보듯이 객체는 Attribute 데이터, 그리고 Method의 주소만 갖고 있을 뿐이다.

따라서 직렬화의 대상은 실체가 없는 Method는 제외하고 Attribute만 직렬화하게 된다.




객체 직렬화 하는 방법

- Serializable Interface를 implements한 class의 객체는 뭐든 직렬화가 가능하다.



ex) 직렬화 대상 클래스

 

import java.io.*; 

public class Member implements Serializable{
    private String name; 
    private transient int age;
    private String address; 
    private transient MyDate birthday;
    ...
}


ex) 객체 직렬화 하기

 

public void writeMemberObject(Member m) throws IOException {
    ObjectOutputStream oos = null; 
    try{ 
        oos = new ObjectOutputStream(new FileOutputStream("mem.obj")); // 연결 + 필터 추가 
        oos.writeObject(m); // 객체를 출력하는 메소드: writeObject(Object obj) 
        // write할 때 Exception이 발생하는데 이 때 close를 안하면 스트림이 안닫혀있는 상태로 방치 
    } finally { 
        if(oos!=null) { 
            oos.close(); // 그래서 close로 닫아줌 
        } 
    } 
}





객체 직렬화 피하기 (또는 피해야 되는 경우)

 

- 객체 Instance 변수 앞에 transient 키워드를 붙이면 직렬화 대상에서 제외된다.

- 그런데 왜 직렬화 대상에서 제외할까? 답은...


1. 보안적인 측면에서 직렬화 할 때 빼고 싶을 때

 보안 문제로 직렬화 하면 안되는 어트리뷰트가 여기에 해당한다.


2. 직렬화 대상이 아닌 객체 type일 경우

 만약 다음과 그림과 같은 A 객체와 B 객체를 직렬화 한다고 해보자.


위와 같은 구조에서 A, B 객체들을 직렬화하고 싶을 때 어떻게 할까?


답은 B 객체의 멤버 인스턴스인 C 객체에 transient 키워드를 붙여준다.

그러면 직렬화 대상에서 제외되므로 소스 코드를 통채로 고치지 않아도 된다.






역직렬화 객체를 복원하는 방법

- 객체를 만든 뒤 readObject() 메소드의 리턴하는 Attribute 대입

- 자바가 역직렬화하는 방식은 JVM이 역직렬화 하고자 하는 객체를 만들어서 리턴한다.



ex)

 

public Member readMemberObject() throws IOException, ClassNotFoundException {
    ObjectInputStream ois = null; 
    Member m = null; 
    try    { 
        ois = new ObjectInputStream(new FileInputStream("mem.obj")); 
        m = (Member)ois.readObject(); 
    } finally { 
        ois.close(); 
        return m; 
    } 
}

 



그런데 여기서 문제가 발생한다.

만약 역직렬화해서 만든 객체(readObject() 메소드로 불러들인 객체)의 클래스가 변경이 되었다면?

그런데도 역직렬화한 객체를 변경된 클래스의 인스턴스에 대입하려고 한다면?


당연히 이 때 JVM은 역직렬화 객체를 대입할 수 없다고 예외를 발생시킨다.

좀 더 자세히 살펴보면 역직렬화한 객체와 새로 변경된 클래스의 serialVersionUID가 일치하지 않아서 발생하는 문제인데

새로 변경된 클래스와 역직렬화하는 객체의 serialVerionUID를 일치시켜주면 된다.


그럼 또 어떻게 serialVerionUID를 일치시켜준단 말인가?

답은...


클래스를 작성할 때 미리 serialVerionUID를 상수로 고정시켜 놓는다. 이렇게 되면 클래스가 새로 변경이 되도 역직렬화하는 객체와 serialVerionUID가 같기 때문에 예외가 더 이상 발생하지 않는다.



ex) 직렬화 대상 클래스 (역직렬화 문제 해결)

 

import java.io.*; 

public class Member implements Serializable{
    // 직렬화, 역직렬화 시 serialVersionUID 상수가 없으면 JVM이 만들어서 넣어준다. 
    // 있으면 만들지 않는다. 
    static final long serialVersionUID = 100L;
    private String name; 
    private transient int age;
    ...
}
Posted by 1010
반응형

import java.io.*;
import java.net.*;

/* 843포트에서 대기하는 서버소켓은 클라이언트가 접속하여 정책파일을 요청하면 정책파일의 내용을
 * 출력스트림으로 전송해 주고, 소켓을 닫는다.
 * 액션스크립트 클라이언트(Flex)에서 서버(채팅서버 등)에 접속하기 위해서는 서버가 실행중인 호스트에
 * 이 정책파일서버가 먼저 실행되고 있어야 한다.
 */
public class PolicyServerServlet {

 public static void main(String[] args) throws Exception {
  ServerSocket ss = new ServerSocket(843);
  Socket client = null;
  PrintWriter toClient = null;
  System.out.println("정책파일서버실행....");
  while (true) {
   client = ss.accept();
   InputStreamReader isr = new InputStreamReader(
     client.getInputStream());
   char[] buf = new char[1024];
   int read = isr.read(buf);
   String request = new String(buf, 0, read);
   if (request.equals("<policy-file-request/>\0")) {
    System.out.println("정책파일요청접수됨");
   } else {
    System.out.println("정책파일요청아님");
    continue;
   }
   // System.out.println("정책파일서버요청문자열:"+request);
   toClient = new PrintWriter(client.getOutputStream());
   String policy = "<?xml version='1.0'?>";
   policy += "<cross-domain-policy>";
   policy += "<site-control permitted-cross-domain-policies='*'/>";
   policy += "<allow-access-from domain='*' to-ports='*' />";
   policy += "</cross-domain-policy>";
   toClient.println(policy);
   toClient.flush();
   client.close();
   System.out.println("정책파일 전송완료");
  }
 }
}

 

Posted by 1010